Redis的数据类型
String
1.set name zhangsan
2.get name
3.setex name 5 zhangsan --设置时间为5秒
4.getset name zhangsan --给name设置值为张三,并且返回原来的值
5.setnx name zhangsan --只有name不存在时,设置zhangsan ,否则不设置
6.incr age --给age 的值加一,如果age不是数字类型,那么就报错
7.decr age
hash
(用于封装一个对象的,比如说淘宝购物车)
1.hset shoppingCart name phone
2.hget shoppingCart name
3.hmset shoppingCart name phone price 1000 color red
--同时设置大key中的多个小key
4.hmget shoppingCart name price color
-- 同时获取大key中多个小key的值
5.hkeys shoppingCart --获取所有小key
6.hvals shoppingCart --获取所有小key对应的值
7.hgetall shoppingCart --获取所有键值对
8.hexists shoppingCart name --判断小key是否存在
list
(用再消息队列,心跳包,)
1.lpush heart 4 3 2 1
2.rpush heart 1 2 3 4
3.lrange heart 2 3 -- 获取第二个到第三个的元素
4.llen heart -- 获取列表长度
5.rpop heart --右右右弹出并获取最后一个元素
6.brpop heart 10--移除并且获取最后一个元素,如果列表没有元素,元素会等待10秒,10秒内如果有元素进来,那么就弹出
7.lindex heart 2 -- 获取第2个索引上的值
8.lrem heart 2 1 --移除heart上第2个开始往后1个的元素
set
(微信的朋友圈点赞)praise 是点赞 comment是评论
1.sadd praise zhangsan lisi wangwu ---向集合添加多个成员
2.smembers praise---- 返回集合的所有元素
3.scard praise----- 返回集合的成员数
4.sinter praise comment返回所有集合的交集
5.sunion praise comment返回所有集合额并集
6.sdiff zhangsan lisi 返回所有集合的差集
7.sismember praise zhangsan 判断zhangsan 有没有在praise中
8.spop praise --- 随机弹出一个元素
9.srem praise zhangsan lisi--- 移除集合中一个或者多个元素
zset
lol战力榜
zadd lol 100 zhangsan 200 lisi 300 wangwu --往集合中添加一个或者多个成员,或者更新已经存在的分数
zrange lol 50 350 [withscores] --表示50到350的从低到高排序,加上withscores表示一起返回列名
zreverange lol 50 350 [withscores] --表示50到350的从高到排序,加上withscores表示一起返回列名
zincrby lol 20 zhangsan --- 给zhangsan 加20分
zrem lol zhangsan lisi ---- 移除集合中的成员
淘汰策略
1.会立刻删除过期的key吗
不会立刻删除,因为删除key时肯定时主服务来删除,所以当他在执行删除指令的时候,他就无法进行其他操作,立刻删除会影响性能
2.redis的删除机制
主动删除
redis获取一个key值,先判断这个key是否过期,如果过期,则执行删除操作
惰性删除
redis在后台会开启一个定时任务,定时去更具指定的淘汰策略来删除key
redis中的问题
缓存穿透
人为攻击行为,查询一个数据库中没有,缓存中也没有的数据,如果一直查询该数据,就会直接穿透缓存,到达数据库,可以会导致数据库宕机
解决方案
1.直接给假数据
2.布隆过滤器
缓存击穿
缓存中某一个热点数据的key突然过期,造成大量的请求无法从缓存中获取数据,而直达数据库
解决方案
1.热点数据永远不过期
2.限流(在单位时间内,允许多少个请求来访问数据)
3.降级(缓存降级是指当访问量剧增,即使是有损部分其他服务,仍然需要保证主服务可用,可以将其他次要访问的数据进行缓存降级,从而提升主服务的稳定性)
缓存雪崩
缓存中大量的key在同一时间过期,造成大量的请求无法从缓存中获取数据,而直达数据库。感觉就像出现了雪崩
解决方案
1.热点数据永不过期
2.不同的key随机生存时间
Redis是单线程的吗?
-
对于IO读写在6.0版本之前是单线程的,在6.0版本之后是多线程的
-
对于Redis的读写指令是单线程的
-
对于Redis在执行一些数据备份、淘汰key这些机制是多线程的
Redis在处理数据读写方面是单线程的?为什么还那么快?
1.基于内存操作
2.因为是单线程,所以没有线程切换带来的开销
3.redis的nio多路复用
单节点存在的问题
数据安全
Redis宕机,数据就丢失了【因为数据默认存储介质是内存】
读写瓶颈
读11 w/s 写8w /s
故障转移
为了保证服务器具备写的功能,就需要做主从选举
存储瓶颈
单节点存储的数据是有限的
数据持久化
RDB 方式
是将 redis 某一时刻的数据持久化到磁盘中,是一种快照式的持久化方法,(数据存储在查看dump.rdb中)
AOF 方式
是将执行过的写指令记录下来,在数据恢复时按照从前到后的顺序再将指令都执行一遍
标签:缓存,name,--,redis,praise,面试,key,zhangsan From: https://www.cnblogs.com/linxiaofeng/p/16667257.html