redis学习总结

目录

 

一、NoSQL概述

二、数据结构及常用命令

三、redis持久化

一、NoSQL概述

NoSQL即(Not Only SQL),具有易扩展,大数据量高性能,灵活的数据类型,高可用的特点。

redis学习总结

二、数据结构及常用命令

1、Redis 虽然是作为数据库开发的,但由于其提供了丰富的功能,越来越多的人将其用作:缓存、队列系统等。

        缓存:Redis可以为每个键设置生存时间(Time To Live, TTL),生存时间到期后键会自动被删除。

                 Redis还可以限定数据占用的最大内存空间,在数据达到空间限制后可按照一定的规则自动淘汰不需要的键。

        队列:Redis的列表类型键可以用来实现队列,并支持阻塞式读取,可以很容易的实现一个高性能的优先级队列。

 

2、关系数据库中要获取posts表内id为1的记录的title字段的值,可以用如下sql:

            select title from posts where id = 1 limit 1

     相应的,在Redis中要读取键名为post:1的散列类型键的title字段的值,可以使用如下命令:

            HGET  post:1  title       

 

3、字符串

  • 二进制安全的,存入和获取的数据相同
  • value最多可以容纳的数据长度为512M

redis >   SET   bar 1        建立一个名为bar的键              set key value

redis >   get    bar            获取一个名为bar的键的值       get key

redis >   KEYS *               获得redis中所有的键              

redis >   KEYS  bar           获得redis中键为bar

redis >   KEYS  ba*           获得redis中所有以ba开头的键

 

redis >   EXISTS bar         如果键存在返回整数类型1,否则0

 

redis >   del  bar              删除键   返回的是删除键的个数

 

redis >   type  key             获取键值的数据类型:string   hash   list  set   zset

 

redis >   incr  key              递增key对应的值,不存在此key开始默认0,key类型不是整数时报错

redis >   incrby  key 8        指定加多少

redis >   decr key

redis >   decrby key  8

redis >   incrbyfloat key  3.4

 

redis >   append key value       向键值的末尾追加value,返回值是追加后的字符串的总长度

 

redis >   strlen key

 

redis >   mset  key1 v1  key2 v2  key3  v3      同时设置多个键值

redis >   mget  key1  key2  key3                    同时获得多个键值

 

 

4、散列类型  hash

字段值只能是字符串,不支持其他数据类型嵌套。适合存储对象使用对象类别和id构成键名

 

例子:键          字段(filed)            字段值

         car:2       color                    white

                       name                    aodi

                       price                    900000

相比于关系数据库,我们可以为任何一条记录新增属性,而不需要考虑其他记录。

命令:

hset key field value

hget key field

hmset key field value   field1 value1  field2 value2

 

redis >   hset car price 500

redis >   hset car name BMW

redis >   hget car name

redis >   hmget car price name

redis >   hgetall    获取键中所有字段和字段值

 

redis >   hexists key field    判断字段是否存在  存在返回1否则0

redis >   hincby key field 5

redis >   hdel key field

 

redis >   hkeys key        只获取字段名      

redis >   hvals key        只获取字段值   

redis >   hlen key          获取字段数量     

 

 

5、列表类型  list

可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素、或者获得列表的某一个片段。

列表类型内部使用双向链表实现.

经常用于消息队列的一些服务,完成多个程序之间的消息的交互。

 

lpush key value      向列表左边增加元素

rpush key value      向列表右边增加元素,返回值表示增加元素后列表的长度

 

lrange queue 0 3 查询队列元素,queue是队列名,从0位置开始,查询三个元素

lpop key            从列表左边弹出一个元素  

rpop key           从列表右边弹出一个元素  返回被移除的元素值

 

llen key      列表长度

 

lrange key   start  end      获取列表片段,从0开始计数,包含两段

 

lrem key  count  value   count大于0,从左边开始删除前count个值为value的元素,小于0从右边,等于0,删除所欲。

 

redis >   lpush numbers 1         [1]

redis >   lpush numbers 2         [2 1]

redis >   lpush numbers  3,4      [4  3  2  1]

redis >   rpush numbers   5,6    [4  3  2  1  5  6]

 

 

6、集合类型   set

集合中的元素,无序、不重复,而列表类型是有序、重复,正好相反。

由于集合类型在redis内部是使用值为空的散列表 hash table 实现的,所以加入、删除、查找元素的时间复杂度都是o(1)

还可以多个集合类型键之间并集、交集等等。

用于跟踪一些唯一性数据,维护数据对象之间的关联关系。

 

SADD  key member             增加元素

SREM  key member             删除元素

SISMEMBER key member     判断元素是否在集合中  存在返回1,否则0

SMEMBERS key                 获取集合中的所有元素

 

redis >   sadd   set1  a

redis >   sadd   set1  a  b  c

redis >   srem   set1  b

 

集合间运算

sdiff     key  key1          差集

redis >   sadd setA 1 2 3

redis >   sadd setB 2 3 4

redis >   sdiff setA  setB           返回1

sinter  key  key1         交集

redis >   sinter setA  setB          返回2  3

sunion   key  key1       并集

redis >   sunion     setA  setB          返回1 2  3  4

 

redis >   sadd letters  a

redis >   sadd letters b

redis >   smembers  letters  返回所有元素  a   b

redis >   scard    letters     返回个数  2

redis >   sdiffstore  destination   setA  setB   :A和B差集存在destination

redis >   srandmenber  key   随机获取一个元素

 

 

7、有序集合类型   zset

在集合类型的基础上,为每个元素都关联一个分数。

使用场景:

  • 如大型在线游戏积分排行榜
  • 构建索引数据

zadd  key score member

zscore key member   获得元素的分数

zrange  key  start  end   获得排名在某个范围的元素列表

zrangebyscore key min max  获得指定分数范围的元素

zincrby key increment member   为某个元素增加分数

 

redis >   zadd  socreboard   100 zhengchao   90 liuzhen  80 china  

redis >   zscore scoreboard zhengchao

redis >   zrange socreboard 0  2

redis >   zrangebyscore scoreboard   80  100

redis >   zincrby scoreboard   20  zhengchao

 

redis >   zcard key   获得集合中元素的数量

redis >   zcount scoreboard 90  100   获得指定分数范围内的元素个数

redis >   zrem  scoreboard china    删除一个或多个元素

8、事务

redis >   multi                     声明一个事务开始

redis >   sadd key  value

redis >   sadd key1 value1

redis >   exec                     提交

redis >   discard                    回滚

 

语法有错误,整个执行都不会生效

运行错误,成功的就成功了

 

9、生存时间

Redis中可以使用expire命令设置一个键的生存时间,到时间后,redis会自动删除它

语法:

   expire key seconds  ,其中seconds参数表示键的生存时间,单位是秒

 

redis >   set   session:95528     “普法银行”

redis >   expire   session:95528   900                    15分钟有效期,返回1表示成功

 

查询一个键剩余时间:

ttl  key       返回还剩余生存时间,单位秒

 

取消设置生存时间(即设置为永久):

persist  key

 

10、选择数据库

redis默认有16个数据库,默认使用的是第0号数据库。

redis >  select 1        选择1号数据库 

redis >  move key 1      将当前数据库的key移动到1号数据库 

三、redis持久化

1、概述

redis 高性能是因为在内存中,内存中同步到硬盘中就是持久化操作。

2、持久化方式:

RDB方式,默认的方式,无需配置。指定将内存中的数据写入到磁盘中的频率

AOF方式,以日志的形式存储redis数据库中的数据(操作日志),当redis数据库重启时将读取日志中的数据。

可以配置为不进行持久化,redis就当一个缓冲使用。可以同时使用RDB和AOF。

 

RDB

优势: 1.数据库只包含一个文件,通过文件备份策略,定期配置,恢复系统灾难 2.压缩文件转移到其他介质上 3.性能最大化,redis开始持久化时,分叉出进程,由子进程完成持久化的工作 ,避免服务器进程执行I/O操作,启动效率高。

劣势:如果持久化以前,宕机,也就是30s持久化一次,25s的时候宕机,这25s的数据了还没写到硬盘就没了。

 

redis 默认使用RDB 方式持久化

save 900 1 每900秒至少一个key发生变化,就保存一次

save 300 10

save 60 10000

dbfilename dump.rdb 数据文件名

保存的路径是 dir ./    也就是当前路径下

 

AOF

AOF持久化

优势:1.更高的数据安全性, 分为每秒同步,每修改同步,不同步三种方式。

2.对于日志的写入方式采用append模式,在写的过程中发生宕机,写了一半,宕机,下次启动前工具会解决数据一致性问题。

3.如果日志过大,redis会启动重写日志。

  • 每秒同步也是异步完成的,效率也非常高。但是若在这一秒之内发生宕机,则在这一秒中修改的数据就丢失了。
  • 每修改同步即我们可以将其视为同步持久化,每一次发生变化都立即记录到磁盘中。效率低但安全。

劣势:如果宕机  这1s的数据就没了。

每修改同步,安全,但是效率慢。

对于日志的写入方式采用append模式,在写的过程中发生宕机,写了一半,宕机,下次启动前工具会解决数据一致性问题。如果日志过大,redis会启动重写日志。

例如误使用flushall命令情况了数据库,则打开日志文件appendonly.aof,把flushall命令删除,重启redis,则数据会恢复。