01-redis
一.redis 是内存型缓存数据库,属于nosql
二.redis 官网默认只提供linux 版本,window版本可以通过微软github上下载
windows版链接:https://github.com/microsoftarchive/redis/releases
三.windows 版本redis 常用命令
window 版redis 解压即用,截图如下:

1.直接命名行进入redis解压目录:
启动redis:
redis-server.exe redis.windows.conf
2.添加到window系统服务中,然后启动
安装服务,添加到window的系统服务中,使其开机自启动:
redis-server --service-install redis.windows.conf
卸载服务,从window系统服务中移除:
redis-server --service-uninstall
启动服务:
redis-server --service-start
停止服务:
redis-server --service-stop
3.命令行客户端
双击redis-cli.exe 可以进入redis命令行客户端
四.redis可存储的五种数据类型
String 字符串
Hash 哈希
List 字符串列表 (类似java中的LinkedList)
Set 字符串集合
SoredSet 有序字符串集合 (类似java中的TreeSet)
五.redis 命令行下五种数据类型的存、取、删除
1.String 类型
存:set key value
例:set name zhangsan
取:get key
例: get name
删除:del key
例:del user
如果没有key,则返回nil,java代码中实现为null

2.List 类型 元素允许重复 特点:list的存放顺序是根据元素放入的顺序,而不是元素本身的顺序
Redis列表是简单的字符串列表,按照插入顺序排序。
你可以添加一个元素到列表的头部(左边)或者尾部(右边)
从左边添加:lpush key value1 value2 ...
例:lpush mylist a b c d e
从右边添加:rpush key vaule1 value2 ...
例如:rpush list 0 -1 -2
范围取:lrange key startIndex endIndex
特别:lrange key 0 -1 表示取全部
例:lrange mylist 0 1
指定索引取:lindex key index
例:lindex mylist 3


从头部弹出:lpop key
例:lpop mylist
从尾部弹出:rpop key
例如:rpop mylist

3.Hash 类型
存:hset key name value
例:hset myhash user wangwu
取指定key指定键:hget key name
例:hget myhash user
取指定key的所有键值:hgetall key
例:hgetall myhash
删除指定key指定键:hdel key name
例:hdel myhash age

4.Set 类型 元素不允许重复
存:sadd key value1 value2....
例:sadd myset a b c d e
取所有:smembers key
例:smembers myset
删除指定key中指定元素:srem key name
例:srem myset e

5.SoredSet 类型 有序集合,不允许重复 特点:zset 的顺序是指存放元素本身的顺序,一般是根据每个元素的score来排序的, 而不是元素的存放顺序
存:zadd key score1 value1 score2 value2....
例:zadd mysort 1 zhangsan 2 lisi 3 wangwu
范围取:zrange key startIndex endIndex
特别:zrange key 0 -1 表示取全部
例:zrange mysort 0 3
zrange mysort 0 -1
删除:zrange key value
例如:zrange mysort wangwu

六.redis 其他命令
1.自增1: incr key
例如: incr num
2.自减1:decr key
例如: decr num

3.自增步数:incrby key step
例如: incrby num 5
4.自减步数:decrby key step
例如: decrby num 5

5.查看所有键:keys *
例如:keys *
6.判断key是否存在,1代表存在,0代表不存在 exists key
例如:exists mylist
7.删除指定key : del key
例如:del user
8.判断key的类型: type key
例如:type num

七.redis 的持久化
redis.windows.conf配置文件中可配置
1.有RDB 的默认持久化机制
可配置备份策略,会生成dump.rdb文件备份redis里的数据
2.AOF 持久化
可配置,类似于mysql的备份,可以记录每次操作的命令
若开启,会生成appendonly.aof 文件
八.redis的缓存雪崩、缓存穿透、缓存击穿
1.缓存雪崩场景:
缓存机器意外发生了全盘宕机。缓存挂了,此时 1 秒 5000 个请求全部落数据库,
数据库必然扛不住,它会报一下警,然后就挂了。此时,如果没有采用什么特别的方案来处理这个故障,
DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了
解决办法:
事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。
事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 MySQL 被打死。
事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。
2.缓存穿透场景:
比如一个接口是根据话题id查询话题的点赞数,先从redis中查找,如果查不到就去查db;
一般来说话题id都是表的主键,正常用户操作如果第一次redis中没有查找到,db中肯定能查到,
从db中查询到了之后再设置到redis中去。但是黑客给你传了一个负数或者其他值,这个值在redis中和db中都没有。
那么请求就会直接打到db上,高并发的情况下,没有做任何处理,db肯定扛不住。这时redis那层没有起作用,
直接作用到db上,就叫缓存穿透。
解决办法:
当redis和db中都没有查询到的话,可以将对应的id在redis中设置一个特定值,比如-1,然后再设置个缓存时间,
当再次访问的时候先判断是否为特定值,如果是直接返回,不走db;也可以用布隆过滤器
3.缓存击穿场景:
比如一个热点接口数据,先从redis中获取数据, redis中没有再查db; 由于是热点数据,并且设置了过期时间,
可能在key失效的一瞬间,高并发的请求直接打到数据库,给数据库打死,这个就叫做缓存击穿。
解决办法:可以设置热点key永不过期
Last updated
Was this helpful?