redis的安装和配置
windows下Redis的安装和使用
RedisDesktopManager下载
远程连接redis
redis有五种基本数据类型
string 字符串
hash 对象
list 列表
set 集合
zset 有序集合
字符串的命令:
1.set key value # 保存一个键值对
2.get key # 通过key来去对应的值
3.mset key1 v1 k2 v2... # 一次保存多个键值对
4.mget k1 k2 k3 # 通过key来去对应的值
5.setex key second value # 保存一个键值对,同时规定它的失效时间(second)
6.incr key # 对key对应值 加一,注意,只对数据字符串有效
7.incrby key value # 对key对应值 加value
8.decr key # 对key对应值 减一,注意,只对数据字符串有效
参考字符串的命令6
9.decrby key value # 对key对应值 减value
参考字符串的命令7
10.strlen key # 求key对应值的长度
11.append key value # 对key对应的值末尾进行新的拼接
12.setnx key vaule # 如果存在key,则无效,如果不存在,则保存该键值对
- getrange key start end # 获取start和end之间的值
hash命令:主要用来存储对象的
u1 = User(1, "liding", 16, "zhengzhou")
u2 = User(2, "huiyi", 26, "xinyang")
1.hset key field value # 存储key对应属性field的值
(相当于 u1.name == liding)
2.hget key field # 获取key对应属性field的值
3.hmset key f1 v1 f2 v2...# 存储key对应多个属性field的值
4.hmget key f1 f2... # 获取key对应多个属性field的值
5.hgetall key # 获取key对象所有属性和对应的值
6.hkeys key # 获取key对象的所有属性的名称
7.hvals key # 获取key对象的所有属性的值
参考hash命令6
8.hlen key # 获取key的所有属性个数
9.hstrlen key field # 获取key对应的属性的值的长度
10.hexists key field # 判断某个对象是否存在该属性
11.hsetnx key field value # 判断对象的属性是否存在,存在则不操作,不存在,则保存
参考字符串的命令10
12.hincrby key field value # 对对象的属性(必须是数字字符串)进行加法运算
key操作
1.keys * # 查询当前数据库中所有key的个数
2.exists key # 判断某个key是否存在在当前数据库
3.del key # 删除对应的key
4.type key # 判断key的类型
5.expire key second value # 为一个存在的key设置一个失效时间
6.ttl key # 查看key的失效时间 -2表示不存在 -1 永久存在 正数表示存活的秒数
7.move key db # 移动key到db数据库中
8.select index # 切换数据库
9.info [xxxx] # 查看当前数据库的状态
10.dbsize # 返回当前数据库的key的个数
11.flushdb # 删除当前数据库的所有数据
12.flushall # 删除所有数据库的所有数据
自行处理(慎用)
13.persist key # 让key永久保存
list命令
1.lpush key v1 v2... # 从左侧将值放入list中
2.rpush key v1 v2... # 从右侧将值放入list中
参考list命令1
3.lrange key start end # 循环显示list
4.linsert key b|a piovt v # 将值插入到对应的位置
5.lpop key # 从左侧删除第一个元素
6.rpop key # 从右侧删除最后一个元素
参考list命令5
7.llen key # 获取list的长度
8.ltrim key start stop # 切割列表
9.lindex key index # 获取索引位对应的元素
set集合
1.sadd key v1 [v2 v3] # 添加值到set集合中
2.smembers key # 迭代遍历set集合
3.sismember key value # 判断是否存在一个元素在set集合中
4.scard key # 得到set的元素个数
5.sinter s1 s2 # 求两个集合之间的交集
6.sdiff s1 s2 # 求两个集合之间的差集
7.sunion s1 s2 # 求两个集合之间的并集
sorted set 有序集合
1.zadd key s1 v1 s2 v2... # 为有序集合增加元素,该元素存在一个权重,用于判断位置
2.zcard key # 求有序集合的元素个数
3.zrange key start stop # 遍历整个集合
4.zcount key min max # 统计两个权重的元素个数
5.zscore key 元素 # 返回该元素在集合中的权重
redis密码设置
1.sudo vim redis.conf
2.找到 #requirepass root
3.将root改为自己想设置的密码保存退出,重启redis
5.重启后auth 密码
就可以正常使用了
缓存穿透
什么是缓存穿透?
一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。如果key对应的value是一定不存在的,并且对该key并发请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。
如何避免?
1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。
2:对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。
缓存击穿
什么是缓存击穿?
对于一些设置了过期时间的key,如果这些key可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:缓存被“击穿”的问题,这个和缓存雪崩的区别在于这里针对某一key缓存,前者则是很多key。
缓存在某个时间点过期的时候,恰好在这个时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
如何避免?
1.使用互斥锁(mutex key)
业界比较常用的做法,是使用mutex。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。
- "提前"使用互斥锁(mutex key):
在value内部设置1个超时值(timeout1), timeout1比实际的memcache timeout(timeout2)小。当从cache读取到timeout1发现它已经过期时候,马上延长timeout1并重新设置到cache。然后再从数据库加载数据并设置到cache中
3.. "永远不过期":
这里的“永远不过期”包含两层意思:
(1) 从redis上看,确实没有设置过期时间,这就保证了,不会出现热点key过期问题,也就是“物理”不过期。
(2) 从功能上看,如果不过期,那不就成静态的了吗?所以我们把过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存的构建,也就是“逻辑”过期
从实战看,这种方法对于性能非常友好,唯一不足的就是构建缓存时候,其余线程(非构建缓存的线程)可能访问的是老数据,但是对于一般的互联网功能来说这个还是可以忍受。
- 资源保护:
采用netflix的hystrix,可以做资源的隔离保护主线程池,如果把这个应用到缓存的构建也未尝不可。
缓存雪崩
什么是缓存雪崩?
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。
如何避免?
1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
2:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
3:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期(此点为补充)