一 redis数据类型
1.string(字符串)
命令:
set key v:储存值
get key:取值
getrange key start end :返回key中字符串值得子字符
getset key v:将给定key的值设置为v,并返回key的旧值
incr key:将 key 中储存的数字值增一
incrby key increment:将 key 所储存的值加上给定的增量值(increment)
decr key:将 key 中储存的数字值减一。
DECRBY key decrement:key 所储存的值减去给定的减量值(decrement)
2.list(列表):可以是保存字符串、整数和浮点数
命令:
lpush 列表名字 元素:在列表头部即链表的头部(左边)添加一个或者多个元素
rpush 列表名字 元素:在列表尾部即链表的尾部(右边)添加一个或者多个元素
lpop 列表名字:删除列表(链表)头部(左边)的第一个元素
rpop 列表名字:删除列表(链表)尾部(右边)的第一个元素
lrange 列表名字 开始下标 结束下标:查看列表指定下标段的元素
ltrim 列表名字 开始下标 结束下标:截取指定下标段列表
lrem 列表名字 指定删除个数 要删除的v值:删除列表中的特定元素,因为链表中可能不止一个这样的元素,可能存在相同的元素
lindex 列表名字 指定下标 删除链表中指定元素值
llen 列表名字 输出列表中的元素个数即链表的长度
rpoplpush 列表1 列表2 :将第一个列表所对应的链表的最后一个元素节点移到第二个列表所对应的链表的第一个元素结点处
lset 列表名称 已有下标 新值:给列表指定下标重新赋值
linsert 列表名称before/after 列表中的某一个值:在列表中对应的链表的特定元素的前面或者后面插入一个元素
3.set(集合):它是一个链表,它的每一个节点都包含一个字符串
sadd set 1 2 3 创建一个 set 集合,里面有1,2,3 这 3 个元素(set类型的数据会自动去重):
smembers set 查看 set 里面的元素
sismember set 6 判断 6 是否在 set 集合里面(是:1,否:0):
scard set 统计 set 里面元素的个数:
srem set 1 移除 set 集合里面的 1(成功:1,失败:0):
srandmember set 1 随机返回 set 中的1个数:
spop set 随机从 set 中出栈一个元素:
smove set1 set2 2 将 set 中的 2 移动到 set2:
sdiff set1 se2 set中的所有元素减去 set2 中与 set1 共有的那部分:
sinter set1 set2 取 set1 和 set2 的交集:
sunion set1 set2 取 set1 和 set2 的并集:
4.zset(有序集合):它是一个收集器,但是是无序的,在它里而每一个元素都是一个字符串,而且是独一无二,各不相同的
ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数。
ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合成指定区间内的成员
ZCARD key 获取有序集合的成员数
ZCOUNT key min max 计算在有序集合中指定区间分数的成员数
ZSCORE key member 返回有序集中,成员的分数值
ZREM key member [member …] 移除有序集合中的一个或多个成员
RANGEBYLEX key min max [LIMIT offset count] 通过字典区间返回有序集合的成员
返回值:指定区间内的元素列表
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]通过分数返回有序集合指定区间内的成员
ZRANK key member 返回有序集合中指定成员的索引
ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
ZREVRANGE key start stop [WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到底
ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有序集中指定分数区间内的成员,分数从高到低排序
ZREMRANGEBYLEX key min max 移除有序集合中给定的字典区间的所有成员
REMRANGEBYRANK key start stop 移除有序集合中给定的排名区间的所有成员
ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员
ZINTERSTORE destination numkeys key [key …]计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
5.hash(哈希):是一个键值对应的无序列表
命令 语法 语义
hset hset key field value 设置哈希集key中指定字段field的值为value
hmset hmset key field value [field value …] 设置哈希集key中若干指定字段field的值为value
hsetnx hsetnx key field value 在哈希集key中不存在字段field时,添加字段field并将其值设为value
hdel hdel key field [field …] 从哈希集key中移除指定的若干字段field
hincrby hincrby key field increment 使哈希集key中字段field的值增加increment
hincrbyfloat hincrbyfloat key field increment 使哈希集key中字段field的float值增加increment
hget hget key field 返回哈希集key中字段field的值
hgetall hgetall key 返回哈希集key中所有字段和值
hmget hmget key field [field …] 返回哈希集key中若干指定字段field的值
hkeys hkeys key 返回哈希集key中所有字段的名字
hvals hvals key 返回哈希集key中所有字段的值
hlen hlen key 返回哈希集key中包含字段的数量
hstrlen hstrlen key field 返回哈希集key中字段field的值长度
hexists hexists key field 返回哈希集key中字段field是否存在
6.HyperLogLog(基数)基数:它的作用是计算重复的值,以确定存储的数量
redis缓存穿透,击穿和雪崩以及解决方案
情况 | 原因 | 解决方法 |
缓存穿透 | 因为服务出于容错考虑,当请求从持久层查不到数据则不写入缓存,这将导致请求这个不存在的数据每次都要到持久层去查询,失去了缓存的意义。 此时,缓存起不到保护后端持久层的意义,就像被穿透了一样。导致数据库存在被打挂的风险。 | 1.接口请求参数的校验。对请求的接口进行鉴权,数据合法性的校验等;比如查询的userId不能是负值或者包含非法字符等。 2.当数据库返回空值时,将空值缓存到redis,并设置合理的过期时间。 3.布隆过滤器。使用布隆过滤器存储所有可能访问的 key,不存在的 key 直接被过滤,存在的 key 则再进一步查询缓存和数据库。 |
击穿 | 某个热点 key,在缓存过期的一瞬间,同时有大量的请求打进来,由于此时缓存过期了,所以请求最终都会走到数据库,造成瞬时数据库请求量大、压力骤增,导致数据库存在被打挂的风险。 | 1.加互斥锁。当热点key过期后,大量的请求涌入时,只有第一个请求能获取锁并阻塞,此时该请求查询数据库,并将查询结果写入redis后释放锁。后续的请求直接走缓存。 2.设置缓存不过期或者后台有线程一直给热点数据续期。 |
雪崩 | 大量的热点数据过期时间相同,导致数据在同一时刻集体失效。造成瞬时数据库请求量大、压力骤增,引起雪崩,导致数据库存在被打挂的风险。 | 1.将热点数据的过期时间打散。给热点数据设置过期时间时加个随机值。 2.加互斥锁。当热点key过期后,大量的请求涌入时,只有第一个请求能获取锁并阻塞,此时该请求查询数据库,并将查询结果写入redis后释放锁。后续的请求直接走缓存。 3.设置缓存不过期或者后台有线程一直给热点数据续期。 |
Redis持久化
1.RDB快照持久化
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失
RDB快照持久化。所谓快照,在这里指的是某一时刻的内存数据,而持久化则是将这一时刻的数据以二进制形式写入到磁盘里。
RDB 文件恢复 开启自动持久化后,数据会存储到名为 dump.rdb 的文件中。当 Redis 服务器重启时,检测到 dump.rdb 文件后,会自动加载进行数据恢复。
2.AOF持久化
文件追加持久化。与RDB 不同的是,它以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只允许追加文件,不允许修改文件,Redis启动之初会读取该文件重新构建数据,换句话说就是,Redis重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
风险:
1. 数据可能会丢失:如果 Redis 刚执行完命令,此时发生故障宕机,会导致这条命令存在丢失的风险。
2. 可能阻塞其他操作:AOF 日志其实也是在主线程中执行,所以当 Redis 把日志文件写入磁盘的时候,还是会阻塞后续的操作无法执行。
RDB 优点与缺点
(1)优点
- 文件体积小:RDB 的文件内容是二进制格式,因此体积比实例内存小。
- 恢复速度快
(2)缺点
- 数据缺失:RDB 保存的是某一时刻的数据,当 Redis 实例某一时刻异常时,会导致数据丢失。
- 消耗资源:RDB 文件的生成会消耗大量的 CPU 和内存资源,有一定代价。
AOF 优点与缺点
(1)优点
- 数据更完整:AOF 中是及时写入的方式,数据保存更完整。恢复时降低数据的损失。
- 易读性强:AOF 中保存的数据格式是客户端的写入命令,可读性性强。
- 文件体积大:AOF 中存储客户端所有的写命令,未经压缩,随着命令的写入,文件会越来越大。
- 增加磁盘IO:AOF 文件刷盘如果采用每秒刷一次的方式会导致磁盘IO升高,影响性能。
RDB持久化
- 将某一时刻的数据以二进制形式写入到磁盘里,服务重启时检测到对应文件自动加载进行数据恢复。
- 有手动触发和自动触发两种机制。
AOF持久化
- 以文件追加的方式写入客户端执行的写命令。
- 数据恢复时,通过创建伪客户端的方式执行命令,直到恢复完成。
Redis 中的事务从开始到结束也是要经历三个阶段:
- 开启事务
- 命令入列
- 执行事务/放弃事务
其中,开启事务使用 multi命令,事务执行使用 exec命令,放弃事务使用 discard命令。