redis:
缓存击穿:对于访问过期的key查询数据时,加锁,保证只有一个线程去底层获取数据,并返回结果缓存
缓存穿透:对于访问不存在的key时给出空结果并缓存,或引入布隆过滤器将数据提前缓存在布隆过滤器中
缓存雪崩:对于key采用随机过期时间,避免大量的key在同一时间失效导致数据库承载过高
持久化机制:
AOF:以追加 命令行记录的方式记录完整的日志 优点:能够完整恢复数据 缺点:恢复备份效率低
RDB:以二进制的方式定时本分数据 优点:恢复备份效率高 缺点:存在备份时间临界区有丢失数据的可能
AOF + RDB:定时备份数据以二进制的方式写入文件,增量以命令行的记录方式追加到文件当中
数据类型:
string : redis最基本的类型,二进制安全的,可以包含任何数据,比如图片或者序列化的对象最大能存储512MB
常用命令:
set key value 设置指定key的值
get key 获取指定key的值
setnx key value 当且仅当key不存在时设置值
setex key sencods value 设置key的存活时间,如果key存在覆盖新增,必须指定存活时间
append key value 追加字符
setrange key value 用指定的字符串覆盖给定 key 所储存的字符串值,覆盖的位置从偏移量 offset 开始
getrange 用于获取存储在指定 key 中字符串的子字符串。字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)
strlen key 获取字符长度
incr key 对应的数值自增+1
setbit key offset value 设置或者清空key的value(字符串)在offset处的bit值
getbit key offset 返回key对应的string在offset处的bit值 当offset超出了字符串长度的时候,这个字符串就被假定为由0比特填充的连续空间。当key不存在的时候,它就认为是一个空字符串,所以offset总是超出范围,然后value也被认为是由0比特填充的连续空间。到内存分配。
bitcount key 统计字符串被设置为1的bit数.一般情况下,给定的整个字符串都会被进行计数,通过指定额外的 start 或 end 参数,可以让计数只在特定的位上进行。
BITOP operation destkey key [key ...]
对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。
BITOP
命令支持 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种参数:
BITOP AND destkey srckey1 srckey2 srckey3 ... srckeyN
,对一个或多个 key 求逻辑并,并将结果保存到 destkey 。BITOP OR destkey srckey1 srckey2 srckey3 ... srckeyN
,对一个或多个 key 求逻辑或,并将结果保存到 destkey 。BITOP XOR destkey srckey1 srckey2 srckey3 ... srckeyN
,对一个或多个 key 求逻辑异或,并将结果保存到 destkey 。BITOP NOT destkey srckey
,对给定 key 求逻辑非,并将结果保存到 destkey 。
hash: Hash类型的值中包含多组field value
常用命令:
hset key field value 给key中的field设置值
hget key field value 获取key中国的field的值
hmset key field value fieldvalue... 给key设置多个field的值
hmget key field field 获key中多个field的值
hvals key 获取key中所有的value值
hgetall key 获取key中所有field,value
hdel key field 删除key中的field
list: redis列表是简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部或者尾部
应用场景:1:实现最新消息排行等功能 2:消息队列,利用push操作将任务存在list中,然后工作线程再用POP操作将任务取出执行
常用命令:
rpush key value value 向列表尾部插入一个或多个值
lrange key 0 -1 返回列表中指定区间内的值,可以使用-1代表末尾
lpush key value value 将一个值或多个值插入到列表前面
llen key 获取列表长度
lrem key count value 删除列表中的元素,count为正数代表从左往右删除元素个数,为负数代表从右到左删除袁术个数
set: string 类型的无序集合 当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,且set提供了判断某个成员是否在一个set集合内的重要接口。
如在社交应用中,每个人的好友存在一个set集合中,求两个人的共同好友操作只需要用求交集命令即可。 redis还提供了并集,差集等操作。
set的内部实现是一个value永远为null的HashMap,实际就是通过计算hash方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因
使用场景:1:共同好友,二度好友 2:利用唯一性,可以统计访问网站的所有独立IP
常用命令:
sadd key value value 向集合中添加内容,不允许重复
scard key 返回集合元素数量
smembers key 查看集合中元素内容
SINTERSTORE destination key [key ...] 求两个集合的交集,将结果保存在destination集合中,如果destination集合存在则会被重写.
sorted_set 与set不同之处在于,每个元素都会关联一个double类型的分数,通过分数来为集合中的成员进行从小到大的排序,zset成员是唯一的,但分数(score)可以重复。
使用场景:带有权重的元素,比如一个游戏的用户得分排行榜
常用命令:
zadd key score value score value:向有序集合中添加数据
zrange key 0 -1 [withscores]:返回区间内容,withsores表示带有分数
缓存的更新机制:
被动更新:有效期到后,再次写入; 客户端查询数据时,从数据库中获取,写入缓存。 在缓存有效期(t)内,所有查询走缓存,所有写入走数据库。
使用场景:对数据的准确性,实时性要求不高的场景,如博客的浏览访问量
主动更新:
1:更新缓存,更新数据库 数据不一致的风险比较高,一般不采用
2:更新数据库,更新缓存 并发请求会出现数据不一致;修改数据库再经过大量计算得出缓存值,浪费性能,如缓存还没使用,更加浪费
3:删除缓存,更新数据库 一般不采用;
(1):读的效率一般比写的效率要高,当还未执行更新数据库,缓存有可能会被再次写入,最终导致数据不一致。
(2):延迟双删,更新数据库后再休眠一段时间后再次删除缓存,导致系统吞吐量下降
(3):借用中间件,消息队列,重发消息 ,系统外订阅:canal,binlog 二次删除key,与业务代码解耦
4:更新数据库,删除缓存 经常采用的方式; 如果写的效率高于读的效率则可能出现数据不一致的问题,但读的效率一般要高于写的效率,极端情况可再增加延迟双删处理
redis常用命令
启动redis:./redis-server redis.conf
重启redis:./redis-cli shutdown ./redis-server redis.conf
启动客户端工具:./redis-cli 连接指定服务器地址:./redis-cli -h 127.0.0.1 -p 6379
./redis-cli --raw 解决中文数据进制转换问题