Redis 笔记
持久化
- RDB: redis database. 快照
- AOF: append only file. 类似于binlog
清除过期key
每100ms扫描一次:
- 随机取20个key进行扫描
- 检查每个key是否过期,过期的清除
- 如果过期的key超过25%, 重复第1步
内存回收
指的是内存空间不够时,主动放弃一些key
- noeviction: 不回收
- allkeys-lru: 所有key,删除最近未使用的
- volatile-lru: 只对设置了过期时间的key, 删除最近未使用的
- allkeys-random: 所有key,随机删除
- volatile-random: 只对设置了过期时间的key,随机删除
- volatile-ttl: 只对设置了过期时间的key, 删除存活时间短的
- allkeys-lfu: 所有key,删除使用频率最少的
- volatile-lfu: 只对设置了过期时间的key, 删除使用频率最少的
Redis事务
MULTI开启事务,EXEC提交事务,DISCARD丢弃
Redis与Memcache的比较
- redis支持更丰富的数据类型(支持更复杂的应用场景):Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。memcache支持简单的数据类型,String。
- Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而Memecache把数据全部存在内存之中。
- 集群模式:memcached没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;但是 redis 目前是原生支持 cluster 模式的.
- Memcached是多线程,非阻塞IO复用的网络模型;Redis使用单线程的多路 IO 复用模型。
缓存问题
- 穿透:缓存不存在,数据库不存在,少量key
- 击穿:缓存不存在,数据库存在,少量key。解决方案是加互斥锁(jvm或者分布式)
- 雪崩:缓存不存在,数据库存在,大量key。解决方案是过期时间在一个范围内随机取。
缓存穿透
简介:一般是黑客故意去请求缓存和数据库中不存在的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。
解决办法: 有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。另外也有一个更为简单粗暴的方法(我们采用的就是这种),如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。
常用命令
显示所有key: keys *
//删除当前数据库中的所有Key flushdb //删除所有数据库中的key flushall
删除部分key redis-cli keys "new_ticket*" | xargs redis-cli del
EVAL "for i, name in ipairs(redis.call('KEYS', ARGV[1])) do redis.call('DEL', name); end" 0 "user_account_*"
服务器的redis会丢数据,原因是: WARNING overcommit_memory is set to 0! Background save may fail under low memory condition.
解决办法: To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
删除一个set的所有元素: del aSet
redis的历史命令是保存在客户端的~/.redis_history里面的,所以不用担心服务器
info keyspace 能查看有多少个key
redis 杀掉client
先把最大连接数设置为20000
config set maxclients 20000
再kill掉
sudo netstat -anp |grep 6380| grep '120.76.198.44' | awk '{print $5}' | xargs -I % redis-cli -p 6380 client kill %