目录
[5.有序集合(sorted set)](#5.有序集合(sorted set))
一、Redis简介
Redis是一个开源的、基于内存的键值对存储系统,通常被用作数据库、缓存和消息中间件。
- **内存存储:**数据主要存储在内存中,读写速度极快,也支持持久化到磁盘。
- 数据结构: Redis支持多种数据结构,包括:
- 字符串(String)
- 哈希(Hash)
- 列表(List)
- 集合(Set)
- 有序列表(Zset)
- 持久化支持:
- RDB
- AOF
数据结构和丰富的功能,成为现代应用架构中不可或缺的组件。
二、Redis数据结构
1.字符串(String)
常用命令
1.设置指定key的值
SET key value //SET study redis指定key是study的值为redis
2.获取指定key的值
GET key //GET study 获取key为study的值
3.获取key为study的值的长度
STRLEN study
4.将key为study的值增加
INCR study //将key为study的值增1
INCREBY study 5 //将key为study的值增5
5.将key为study的值减少
DECR study //将key为study的值减1
DECRBY study 5 //将key为study的值减5
6.如果key存在,追加在原value末尾
APPEND study db //若原value为redis,拼接后为redisdb
7.返回key中字符串值得子字符
GETRANGE study 0 3 //若value为redis,则返回redi
8.同时设置一个或多个键值对
MSET key value [key value ...]
//如MSET k1 v1 k2 v2,即设置了两个键值对分别是<k1,v1>、<k2,v2>
9.同时设置一个或多个键值对,当且仅当所有给定key都不存在
MSETNX key value [key value ...]
//当所有key都成功设置,返回1
//如果至少有一个key已经存在,设置失败,返回0
10.获取所有给定key的值
MGET key1 [key2 ...]
11.将value关联到key,并将key的过期时间设为5(秒为单位)
SETEX key 5 value
2.哈希(Hash)
Redis中hash是一个string类型的field(字段)和value(值)的映射表,hash特别适合存储对象
Redis中每个hash可以存储2^32-1键值对
常用命令
1.删除一个或多个哈希表字段
HDEL key field1 [field2]
2.查看哈希表key中,指定的字段是否存在
HEXISTS key field
3.获取存储在哈希表中指定字段的值
HGET key field
4.获取在哈希表中指定key的所有字段和值
HGETALL key
5.为哈希表key中的指定字段的数值加上增量increment
HINCREBY key field increment //指定字段的整数值
HINCREBYFLOAT key field increment //指定字段的浮点数值
6.获取哈希表中所有字段
HKEYS key
7.获取哈希表中字段数量
HLEN key
8.获取所有给定字段的值
HMGET key field1 [field2]
9.同时将多个field-value对设置到哈希表key中
HMSET key field1 value1 [field2 value2]
10.将哈希表key中字段field的值设置为value
HSET key field value
HSETNX key field value //字段field不存在时,设置值
11.获取哈希表中所有值
HVALS key
3.列表(List)
Redis列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表头部(左侧)或者尾部(右侧)
常用命令
1.移出并获取列表的元素,没有元素会阻塞队列直到等待超时或发现可弹出元素为止
BLPOP key1 [key2] timeout //第一个元素
BRPOP key1 [key2] timeout //最后一个元素
2.从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它;没有元素会阻塞队列直到等待超时或发现可弹出元素为止
BRPOPLPUSH source destination timeout
3.通过索引获取列表中的元素
LINDEX key index
4.在列表的元素前或后插入元素
LINSERT key BEFORE|AFTER pivot value
5.获取列表长度
LLEN key
6.移出并获取列表第一个元素
LPOP key
7.将一个或多个值插入到列表头部
LPUSH key value1 [value2]
8.将一个值插入到已存在的列表头部
LPUSHX key value
9.获取列表指定范围内的元素
LRANGE key start stop
10.移除列表元素
LREM key count value //count不为零时是需要移除个数的绝对值,为零是移除所有与value相等的值
11.通过索引设置列表元素的值
LSET key index value
12.对一个列表进行修剪,只保留指定区间内的元素,区间外都将删除
LTRIM key start stop
13.移除列表的最后一个元素,返回值为移除的元素
RPOP key
14.移除列表的最后一个元素,并将该元素添加到另一个列表并返回
RPOPLPUSH source destination
15.在列表中添加一个或多个值到列表尾部
RPUSH key value1 [value2]
16.为已存在的列表添加值
RPUSHX key value
4.集合(Set)
Redis的Set是String类型的无序集合。集合成员是唯一的,集合对象的编码可以是intset或者hashtable
常用命令
1.向集合添加一个或多个成员
SADD key member1 [member2]
2.获取集合的成员数
SCARD key
3.返回第一个集合与其他集合之间的差异
SDIFF key1 [key2]
4.返回给定所有集合的差值并存储在destination中
SDIFFSTORE destination key1 [key2]
5.返回给定所有集合的交集
SINTER key1 [key2]
6.返回给定所有集合的交集并存储在destination中
SINTERSTORE destination key1 [key2]
7.判断member元素是否是集合key的成员
SIMEMBER key member
8.返回集合中所有成员
SMEMBERS key
9.将member元素从source集合移动到destination集合
SMOVE source destination member
10.移除并返回集合中的一个随机元素
SPOP key
11.返回集合中一个或多个随机数
STANDMEMBER key [count]
12.移除集合中一个或多个成员
SREM key member1 [member2]
13.返回所有给定集合的并集
SUNION key1 [key2]
14.所有给定集合的并集存储在destination集合中
SUNIONSTORE destination key1 [key2]
5.有序集合(sorted set)
Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
每个元素会关联一个double类型的分数,通过分数为集合中的成员进行从小到大的排序
有序集合的成员是唯一的,但分数可以重复
常用命令
1.向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZADD key score1 member1 [score2 member2]
2.获取有序集合的成员数
ZCARD key
3.计算在有序集合中指定区间分数的成员数
ZCOUNT key min max
4.有序集合中对指定成员的分数加上增量increment
ZINCRBY key increment member
5.计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合destination中
ZINTERSTORE destination numkeys key [key ...]
6.在有序集合中计算指定字典区间内成员数量
ZLEXCOUNT key min max
7.通过索引区间返回有序集合指定区间内的成员
ZRANGE key start stop [WITHSCORES]
8.通过字典区间返回有序集合的成员
ZRANGEBYLEX key min max [LIMIT offset count]
9.通过分数返回有序集合指定区间内的成员
ZRANGEBYSCORE key min max [WITHSCORES]
10.返回有序集合中指定成员的索引
ZRANK key member
11.移除有序集合中的一个或多个成员
ZREM key member [member ...]
12.移除有序集合中给定的字典区间的所有成员
ZREMRANGEBYLEX key min max
13.移除有序集合中给定的排名区间的所有成员
ZREMRANGEBYRANK key start stop
14.移除有序集合中给定的分数区间的所有成员
ZREMRANGEBYSCORE key min max
15.返回有序集合中指定区间的成员,通过索引,分数从高到低
ZREVRANGE key start stop [WITHSCORES]
16.返回有序集合中指定分数区间内的成员,分数从高到低排序
ZREVRANGEBYSCORE key max min [WITHSCORES]
17.返回有序集合中指定成员的排名,有序集合成员按分数值递减排序
ZREVRANK key member
18.返回有序集合中,成员的分数值
ZSCORE key member
19.计算给定的一个或多个有序集合的并集,并存储在新的key中
ZUNIONSTORE destination numkeys key [key ...]
三、Redis的数据持久化机制
1.RDB
RDB(Redis Database Backup file (Redis数据备份文件)),也被叫做Redis数据快照。把内存中的所有数据都记录到磁盘中,当Redis实例故障重启后,从磁盘读取快照文件,恢复数据
RDB执行原理
bgsave开始时会fork主进程得到子进程,子进程共享主进程的内存数据。完成fork后读取内存数据并吸入RDB文件。
fork采用copy-on-write技术:
当主进程执行读操作时,访问共享内存;
当主进程执行写操作时,拷贝一份数据,执行写操作。
2.AOF
AOF(Append Only File(追加文件))。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。
AOF默认关闭,需要修改redis.conf配置文件来开启AOF
#是否开启AOF,默认no
appendonly yes
#AOF文件名称
appendfilename "appendonly.aof"
AOF的命令记录频率
#每执行一次写命令,立即记录AOF
appendfsync always
#写命令执行完先放入AOF缓冲区,然后每隔1s将缓冲区数据写到AOF文件中,默认方案
appendfsync everysec
#写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
appendfsync no
四、Redis的数据过期策略
1.惰性删除
设置该key过期时间后,不去管它,当需要该key时,再去检查其是否过期,如果过期就删除它,反之返回该key
**优点:**对CPU友好,只会在使用该key时才会进行检查
**缺点:**对内存不友好,如果一个key已过期但是一直没使用,就会一直存在内存中
2.定期删除
每隔一段时间,对一些key进行检查,删除其中过期的key(从一定数量的数据库中取出一定数量的随机key进行检查)
定期删除有两种模式:
SLOW模式:定时任务,执行频率默认10hz,每次不超过25ms,可以通过redis.conf的hz选项来调整这个次数
FAST模式:频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms
**优点:**可以通过限制删除操作执行的时长和频率来减少删除操作对CPU的影响,定期删除也可以有效的释放过期key占用的内存
**缺点:**难以确定删除操作执行的时长和频率
五、Redis的数据淘汰策略
当Redis中的内存不够用时,此时再向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。
Redis支持8中不同策略:
- noeviction:不淘汰任何key,但是内存满时不允许写入新数据,默认策略。
- volatile-ttl:对设置了TTL的key,比较key的剩余TTL值,TTL越小越先被淘汰。
- allkeys-random:对全体key,随机进行淘汰。
- volatile-random:对设置了TTL的key,随机进行淘汰。
- allkeys-lru:对全体key,基于LRU算法进行淘汰。
- volatile-lru:对设置了TTL的key,基于LRU算法进行淘汰
- allkeys-lfu:对全体key,基于LFU算法进行淘汰
- volatile-lfu:对设置了TTL的key,基于LFU算法进行淘汰