redis的基本知识
编译src目录下的c语言程序:make
清空上一次编译:make distclean
make install:相当于配置环境变量,在/usr/local/bin/下生成可执行文件,在任何目录下都能执行
启动redis服务器
./redis-server /myredis/redis.conf (自己复制出来的配置文件)
./redis-cli -a 123456 -p 6379
./redis-cli --raw 显示中文
关闭redis服务器
./redis-cli -a 123456 shutdown -a后面代表密码,代表先连上才能关闭
查看redis启动是否正常(pong代表正常)
查看性能
查看redis服务器的统计信息(例:服务器,客户端、集群等):info
redis默认创建16个数据库实例(编号从0-15),且占用的空间少,可以修改配置文件修改数据库实例创建个数,默认使用第0个,select +编号,切换数据库实例
- dbsize:查看key的数量
- keys *:查看key的值
- flushdb:清空当前实例所有key
- flushall:清空所有key
- config get *:查看所有的配置信息 例:端口号等
redis中key的操作命令
key
- * 匹配0个或者多个字符
- ? 匹配一个字符
- [ ] 从[ ]中匹配一个字符
exists
- 一个key 判断某一个key是否存在,存在返回1,不存在返回0
- 一个多个key 返回存在key的数量,中间用空格隔开
move
- key index 把key移动到指定的数据库实例
expire
- key seconds 设置key的存活时间
ttl
- key 查看key的存活时间,-2表示key不存在;-1表示没有设置,永久存活
type
- key 查看key的数据类型
rename
- key newkey 重命名key,但不会改变之值
del
- key1 key2 ... 删除key,返回删除key的数量
redis的五种数据结构
redis支持数据持久化,支持多种数据结构,支持备份
string
- 设置值:set 键 值(当键存在时覆盖值)
- 得到值:get 键
- 追加值:append 键 值(当key存在返回新字符串的长度,当不存在创建新的key-value)
- 获取字符串长度:strlen 键
- 字符串加一/减一/加指定数值/减指定数值:incr 键/decr 键/incrby 键 数值/decrby 键 数值(key必须是数值,当key不存在默认为0)
- 截取:getrange 键 下标开始 下标结束(包头包尾)-1代表最右边取(-2代表倒数第二位)
- 覆盖:
设置值时同时赋予生命周期
setnx设置值,当key存在时不创建
批量设置值 mset k1 v1 k2 v2 k3 v3...
批量获取值 mget k1 k2 k3 ...
msetnx批量设置值,当key只要有一个存在时不创建
list
- 存值取值
删除表头/表尾
获取指定下标的值
获取列表长度
移除n个value 当n>0,左边移除;当n<0,右边移除
set
存值取值
判断值是否存在
获取集合长度
移除
随机获取 当后面数字>0,不能重复;反之可以重复
随机移除一个或多个
把set1中的a移动到set2 smove set1 set2 a
把set1中有的元素,set2、set3中没有的元素组成一个新集合 sdiff set1 set2 set3
求多个集合的交集 sinter set1 set2 set3
- 求多个集合的并集 sunion set1 set2 set3
hash
- 存值、取值
- 获取所有的filed和value
- 删除一个或者多个filed
得到filed的个数
判断filed是否存在
得到所有filed的值
得到所有value的值
对指定filed对应的值进行加法运算
hsetnx key filed value当filed存在时不创建
zset有序集合
- 存值、取值
删除|获取长度 zrem|zcard
查看某一个的排名(从0开始)
查看某一个的排名(从0开始,从右往左)
获取某一范围内的个数
获取某一个指定的分数
redis的配置文件
redis持久化
redis持久化: redis采用持久化策略,把内存中的数据持久化到磁盘中,当redis重启时再把磁盘中的数据再次加载到内存中使用。
rdb(默认)把save全部注解即可禁用 快照 数据不完整(最后几条数据)
redis事务
multi: 事务开启 exec :事务结束 discard: 清空队列事务结束 watch:相当于乐观锁
例:
总结
redis消息的发布与订阅(了解)
redis主从复制
模拟:复制多个配置文件,修改配置文件,以配置文件启动
启动结果
查看redis角色
设置主从关系:设从不设主,主机上的数据会自动同步到从机上(主机能写能读,从机只能读)
![]()
主机宕机时:从机原地待命,但不影响原有数据的读取,等待主机重启修复
主机不能修复时:从机上位
从机宕机时:需要重新设置主从关系
redis哨兵模式(主机宕机时从机自动上位)
sentinel monitor dc-redis 127.0.0.1 6380 1
./redis-sentinel /myredis/redis-sentinel
redis击穿、穿透和雪崩
击穿: 指的是单个key在缓存中查不到,去数据库查询;如果数据库数据量大并且是高并发的情况下那么就可能会造成数据库压力过大而崩溃(微博热搜,单个key一瞬间失效)(量太大,缓存过期)
解决方案:
- 通过synchronized+双重检查机制:某个key只让一个线程查询,阻塞其它线程
- 设置value永不过期
- 使用互斥锁(mutex key)
穿透:redis都是按照key去缓存查询,如果不存在对应的value,就会去数据库查找。如果key对应的value是一定不存在,并且该key请求量很大,就会对后端系统造成很大的压力,这就叫缓存穿透。(查不到)
解决方案:
- 使用布隆过滤器: 热点数据等场景(具体看使用场景)
- 缓存设置一个空值,将空值返回给请求方
雪崩:当缓存服务器重启或者大量缓存集中在某一时间段失效、服务器宕机,这样在失效的时候,也会给后端系统带来很大压力,这就叫缓存雪崩
解决方案:
- redis高可用(搭建集群)
- 在缓存失效后,通过加锁或者队列来控制读取数据库写缓存的数据量,比如对某个key只允许一个线程查询数据和写缓存,其他线程等待
- 不同的key,设置不同的失效时间,让缓存失效时间尽量均匀