Redis
NoSql常见分类
- 键值对数据库:Redis、Memcache
- 列存储数据库:Hbase、Cassandra
- 文档型数据库:MongoDB、CouchDB
- 图形数据库:Neo4J、FlockDB
缓存方案比较
Ehcache
- 优点
- 基于Java开发
- 基于JVM缓存
- 简单、轻巧、方便
- 缺点
- 集群不支持
- 分布式不支持
Memcache
- 优点
- 简单的key-value存储
- 内存使用率比较高
- 多核处理,多线程
- 缺点
- 无法容灾
- 无法持久化
Redis
- 优点
- 丰富的数据结构
- 持久化
- 主从同步、故障转移
- 内存数据库
- 缺点
- 单线程
- 单核
Redis特点
- NoSql
- 分布式缓存中间件
- key-value存储
- 提供海量数据存储访问
- 数据存储在内存里,读取更快
- 非关系型、分布式、开源、水平扩展
Redis 数据类型
- string: 最简单的字符串类型键值对缓存,也是最基本的
- hash:类似map,存储结构化数据结构,比如存储一个对象(不能有嵌套对象)
- list:列表,[a, b, c, d, …]
- set:不重复的无序集合
- zset: 不重复的有序集合
redis-cli 相关命令
-
key相关
keys *:查看所有的key (不建议在生产上使用,有性能影响)
type key:key的类型 -
string类型
get/set/del:查询/设置/删除
set rekey data:设置已经存在的key,会覆盖
setnx rekey data:设置已经存在的key,不会覆盖set key value ex time:设置带过期时间的数据
expire key:设置过期时间
ttl:查看剩余时间,-1永不过期,-2过期append key:合并字符串
strlen key:字符串长度incr key:累加1
decr key:类减1
incrby key num:累加给定数值
decrby key num:累减给定数值getrange key start end:截取数据,end=-1 代表到最后
setrange key start newdata:从start位置开始替换数据mset:连续设值
mget:连续取值
msetnx:连续设置,如果存在则不设置 -
hash类型
hset key property value:
-> hset user name imooc
-> 创建一个user对象,这个对象中包含name属性,name值为imoochget user name:获得用户对象中name的值
hmset:设置对象中的多个键值对
-> hset user age 18 phone 139123123hmsetnx:设置对象中的多个键值对,存在则不添加
-> hset user age 18 phone 139123123hmget:获得对象中的多个属性
-> hmget user age phonehgetall user:获得整个对象的内容
hincrby user age 2:累加属性
hincrbyfloat user age 2.2:累加属性
hlen user:有多少个属性
hexists user age:判断属性是否存在
hkeys user:获得所有属性
hvals user:获得所有值
hdel user:删除对象 -
list类型
lpush userList 1 2 3 4 5:构建一个list,从左边开始存入数据
rpush userList 1 2 3 4 5:构建一个list,从右边开始存入数据
lrange list start end:获得数据
lpop:从左侧开始拿出一个数据
rpop:从右侧开始拿出一个数据
llen list:list长度
lindex list index:获取list下标的值
lset list index value:把某个下标的值替换
linsert list before/after value:插入一个新的值
lrem list num value:删除几个相同数据
ltrim list start end:截取值,替换原来的list -
其他
select index:切换数据库,总共默认16个
flushdb:删除当前下边db中的数据
flushall:删除所有db中的数据
redis缓存过期处理和内存淘汰机制
缓存过期处理
设置了expire的key缓存过期了,redis有两种策略将其删除:
-
(主动)定时删除:
定时随机检查过期的key,如果过期则清理删除。(每秒的检查次数在redis.conf里的hz配置) -
(被动)惰性删除:
当客户端请求一个已经过期的key的时候,那么redis会检查这个key是否过期,如果过期了,则删除,然后返回一个nil。这种策略对cpu比较友好,不会有太多的损耗,但是内存占用会比较高。
所以,虽然key过期了,但是只要没有被redis清理,那么其实内存还是会被占用着的。
内存淘汰机制
如果内存被redis缓存占用慢了怎么办?redis提供了一套缓存淘汰机制:MEMORY MANAGEMENT
redis.conf配置文件中:
-
可通过配置
maxmemory
,设置一个阈值,当内存已使用率到达,则开始清理缓存 -
淘汰策略:
淘汰策略通过maxmemory-policy
来配置- 1、noeviction:不进行淘汰数据。一旦缓存被写满,再有写请求进来,Redis就不再提供服务,而是直接返回错误。Redis 用作缓存时,实际的数据集通常都是大于缓存容量的,总会有新的数据要写入缓存,这个策略本身不淘汰数据,也就不会腾出新的缓存空间,我们不把它用在 Redis 缓存中。
- 2、volatile-ttl:在设置了过期时间的键值对中,移除即将过期的键值对。
- 3、volatile-random:在设置了过期时间的键值对中,随机移除某个键值对。
- 4、volatile-lru:在设置了过期时间的键值对中,移除最近最少使用的键值对。
- 5、volatile-lfu:在设置了过期时间的键值对中,移除使用频率最少的键值对。
- 6、allkeys-random:在所有键值对中,随机移除某个key。
- 7、allkeys-lru:在所有的键值对中,移除最近最少使用的键值对。
- 8、allkeys-lfu:在所有的键值对中,移除使用频率最少的键值对。
关于 LRU和LFU,可参考:https://blog.csdn.net/yuanlong122716/article/details/104420880