Redis总结 2--Redis数据结构与过期机制

Redis数据结构与过期机制

  • Redis数据结构
    • 5种常见数据类型
      • 字符串String
      • 集合 set
      • 有序集合 sorted set
      • 列表
      • Hash哈希
    • 3种不常见数据类型
      • bitmap位图类型
      • geo地理位置类型
      • stream数据流类型
  • Redis常用命令
  • Redis过期机制
    • 缓存过期和淘汰策略
      • redis性能影响因素
      • redis设置maxmemory
      • expire原理
      • 删除策略

Redis数据结构

redis是一个C语言开发的高性能的内存型键值对NoSql数据库

5种常见数据类型

字符串String

能表示字符串、整数、浮点数
常见操作

  1. set key value
  2. get key
  3. getset key value
  4. setnx key value
  5. append key value 向尾部追加
  6. strlen key
  7. incr key
  8. incrby key increment 增加指定整数
  9. decr
    10.decrby key increment

集合 set

无序唯一元素,个数2^32-1

  1. sadd key m1 m2
  2. srem
  3. smembers
  4. spop
  5. srandmember
  6. scard
  7. sismember
  8. sinter
  9. sdiff
    10.sunion

适用于不能重复且不需要顺序结果的数据结构,比如spop随机抽奖

有序集合 sorted set

zset 有序集合,元素本身是无序不重复
zadd
zrem
zcard
zcount
zincrby
zscore
zrank
zrevrank
zrange
zrevrange

可以用于各种排行榜

列表

list可以表述存储有序、可重复元素,最多为2^32-1个元素,为一个双向链表,可作为栈或队列使用

  1. lpush/rpush key v1 v2
  2. lpop/rpop key
  3. lpushx key v1 将值插入到列表头部
  4. rpushx
  5. blpop key timeout 空时候阻塞
  6. brpop
  7. llen
  8. lindex key index
  9. lrange
  10. lrem key count value
  11. lset key index vallue
  12. ltrim
  13. rpoplpush key1 key2
  14. brpoplpush
  15. linsert

Hash哈希

是一个string类型的field和value映射表,提供了字段和字段值映射
Redis总结 2--Redis数据结构与过期机制_第1张图片

  1. hset
  2. hmset
  3. hsetnx
  4. hexists
  5. hget
  6. hmget
  7. hgetall
  8. hdel
  9. hincrby
    10.hlen

3种不常见数据类型

bitmap位图类型

bitmap是进行位操作的,通过一个bit位来表示某个元素对应的值或者状态,其中key就是对应元素本身。bitmap本身会极大节省存储空间

  1. setbit key offset value 设置key在offset处的bit值
  2. getbit key offset 获得key在offset处的bit值
  3. bitcount key 获得key的bit位位1的个数
  4. bitpos key value 返回第一个被设置为bit值得索引值
  5. bittop and/or/xor/not destkey key [key…] 对多个key进行逻辑后运算后存入destkey中

应用场景:
6. 每月用户签到,用户id为key,日期作为偏移量1表示签到
7. 统计活跃用户,日期为key,用户id为偏移量1表示活跃
8. 查询用户状态,日期为key,用户id为偏移量1表示在线

geo地理位置类型

redis用来处理位置信息,原理是Z阶曲线。在x,y轴上的十进制转换成二进制数,采用x轴和y轴对应的二进制数依次交叉后得到一个六位数编码。把数字从小到大依次连接起来的曲线称为Z阶曲线,Z阶曲线是吧多维转换成1维的一种方式,然后利用Base32这种数据编码机制,主要用来把二进制数据编码成可见字符串
Redis总结 2--Redis数据结构与过期机制_第2张图片
Redis总结 2--Redis数据结构与过期机制_第3张图片

  1. geoadd key 经度 纬度 成员名称1 经度1 纬度1 成员名称2
  2. geohash key 成员名称1 成员名称2 返回标准的hash串
  3. geopos key 成员名称1 成员名称2
  4. geodist key 成员1 成员2
  5. georadiusByMember key 成员 值单位 根据成员查找附近的成员

应用场景:记录地理位置,计算距离,查找“附近的人”

stream数据流类型

stream 是redis5.0之后新增的数据结构,用于可持久化的消息队列,几乎满足了消息队列的全部内容,包括: 消息ID的序列化生成、消息的遍历、消息的阻塞和非阻塞读取、消息的分组消费、未完成消息的处理、消息队列得监控

  1. xadd key id<*> field1 value1
  2. xread
  3. xrange
  4. xrevrange
  5. xdel
  6. xgroup create/destroy key
  7. xgroup delconsumer key groupname cname
  8. xreadgroup group groupname consumer count streams key

Redis常用命令

  1. keys pattern 返回满足指定pattern的所有key
  2. del key
  3. exists key
  4. expire key ttl 指定key的过期时间
  5. rename oldkey newkey
  6. type key

Redis过期机制

缓存过期和淘汰策略

redis性能影响因素

长期使用,key会不断增加,redis作为缓存使用,物理内存也会满
内存与硬盘交换,虚拟内存,频繁IO性能急剧下降

redis设置maxmemory

  1. 不设置场景:Redis的key是固定的,不会增加,作为DB使用,保证数据完整性,不能淘汰,可以做集群,便于横向扩展。缓存淘汰策略:禁止驱逐maxmemory-policy noeviction
  2. 设置场景:redis作为缓存使用,不断增加key,一般设置为物理内存的3/4在redis.conf中maxmemory 1024mb,如果设置了maxmemory,那么久需要设置 maxmemory-policy

expire原理

expires中存储的是key和过期时间

typedef struct redisDb {
      dict *dict; -- key Value dict *expires; -- key ttl dict *blocking_keys; dict *ready_keys; dict *watched_keys; int id; } redisDb;

删除策略

  1. 定时删除:少用,需要建立定时器,让定时器在国企时间来执行对key删除
  2. 惰性删除:在使用时候,如果发现已经过期就删除
  3. 主动删除:配置删除策略,比如maxmemory-policy allkeys-lru
    LRU: 最近最少使用有两种:
    volatile-lru
    从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
    allkeys-lru
    从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
    LFU:一段时间内最少使用: volatile-lfu
    allkeys-lfu
    random:随机volatile-random
    从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
    allkeys-random
    从数据集(server.db[i].dict)中任意选择数据淘汰
    ttl
    volatile-ttl:TTL 数据淘汰机制:从过期时间的表中随机挑选几个键值对,取出其中 ttl 最小的键值对淘汰。
    noenviction
    禁止驱逐数据,不删除 默认
    4.缓存淘汰策略的选择:
    allkeys-lru:在不确定时候一般采用的策略,冷热数据交换
    volatile-lru:比allkeys-lru性能差
    allkeys-random:希望平均
    自己控制:volatile-ttl

你可能感兴趣的:(redis数据结构,大数据,Java,redis)