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值为imooc

    hget user name:获得用户对象中name的值
    hmset:设置对象中的多个键值对
    -> hset user age 18 phone 139123123

    hmsetnx:设置对象中的多个键值对,存在则不添加
    -> hset user age 18 phone 139123123

    hmget:获得对象中的多个属性
    -> hmget user age phone

    hgetall 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中的数据

参考:http://redisdoc.com/

redis缓存过期处理和内存淘汰机制

缓存过期处理

设置了expire的key缓存过期了,redis有两种策略将其删除:

  • (主动)定时删除:
    定时随机检查过期的key,如果过期则清理删除。(每秒的检查次数在redis.conf里的hz配置)

  • (被动)惰性删除:
    当客户端请求一个已经过期的key的时候,那么redis会检查这个key是否过期,如果过期了,则删除,然后返回一个nil。这种策略对cpu比较友好,不会有太多的损耗,但是内存占用会比较高。

所以,虽然key过期了,但是只要没有被redis清理,那么其实内存还是会被占用着的。

内存淘汰机制

如果内存被redis缓存占用慢了怎么办?redis提供了一套缓存淘汰机制:MEMORY MANAGEMENT
redis.conf配置文件中:
image

  • 可通过配置maxmemory,设置一个阈值,当内存已使用率到达,则开始清理缓存

  • 淘汰策略:
    image
    淘汰策略通过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

posted @ 2021-08-30 13:02  金盛年华  阅读(53)  评论(0)    收藏  举报