redis基础

5种基本数据类型

String 字符串

set name daye
get name

Hash 哈希

hmset user:1 name daye email [email protected] age 18
hgetall user:1

List 列表

lpush names daye
lpush names daye2
lrange names 0 -1   // 查找全部

Set 集合 (string类型的无序集合)

sadd names daye
sadd names daye2

smembers names

Zset 集合 (string类型的无序集合)

zadd names daye
zadd names daye2

zrange names 0 -1
zrangescore names 0 -1

key 的基本操作

set key value   设置key
del key         删除key
dump key        返回序列化后的值
exists key      检查key是否存在
expire key      设置key的过期时间
expireat key    用时间戳来设置过期时间
pexpire key     设置key的过期时间以毫秒技
keys pattern    查询符合模式的key
move key dbID   把key移动到指定的db中
persist key     移除指定key的过期时间
pttl key        以毫秒为单位返回key的过期时间
ttl key         返回key的过期时间
randomkey       从当前数据库中随机返回一个key
rename oldkey newkey    修改key的名称
renamenx oldkey newkey    用于在newkey不存在时修改key的名称
type key        返回key的类型

redis数据过期策略

  1. 字符串可以用setex设置过期,其他类型都需要用expire 设置
  2. 如果没有设置时间,那缓存永不过期
  3. 如果设置了时间,用persist设置永不过期

三种过期策略

  • 定时删除
    • 在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key过期时间来临时,对key进行删除
    • 优点:保证内存尽快被释放
    • 缺点:占用资源
  • 惰性删除
    • key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除
    • 优点:对cpu占用比较少
    • 缺点:若大量key在超出时间后,很久没删除,那么可能发生内存泄漏,(无用的垃圾占用了大量的内存)
  • 定期删除
    • 每隔一段时间执行一次性删除过期key操作(配置redis.conf)
    • 优点:通过限制删除操作的时长和频率,来减少删除操作对cpu时间的占用--处理定时删除的缺点;定期删除过期key--处理惰性删除的缺点
    • 缺点:在内存友好方面不如定时删除,在cpu友好方面不如惰性删除
    • 难点:合理设置删除操作的执行时长和执行频率
    • 配置:
      • 配置redis.conf的hz选项,默认为10(即1秒执行10次,100ms一次,值越大说明刷新频率越快,对redis性能损耗也越大)
      • 配置redis.conf的maxmemory最大值,当已用内存超过maxmemory限定时,就会触发主动清理策略
  • 过期key对RDB和AOF没有任何影响,过期key不会进入RDB文件,当key过期时程序会向aof文件追加一条del命令,恢复时就会删掉这个key

reids的持久化

redis提供了2种持久化方式

  1. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。
  2. AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集

key的设计

  • 把表明转换为key的前缀 如tag:
  • 第2段放置用于区分key的字段——对应mysql中主键的列名,如userid
  • 第3段放置表的主键值或unique列,如userid,tag的content: 1, 2, 3 ...
  • 第4段写要存储的列名
set user:userid:1:name 'daye' // 把userid为1的username设置为大爷 
set user:userid:1:email '[email protected]'

keys user:userid:1:*          // 查询所有userid为1的用户信息

# 如果根据username查询就要存储冗余信息
set user:username:daye:userid 1

一些key规范

  • _ _ _
    • 用户Id为1的常用地址总数: UC_ADDRESS_COUNT_1
    • 用户Id为1的常用地址列表: UC_ADDRESS_LIST_1

关于缓存选择的一些建议

  • 统一缓存, 仅缓存一份, 每次访问都需要有网络开销, 数据更新操作方便,直接删除即可
  • 本地缓存, 每台服务器一份或者多份数据, 访问速度快, 不占用带宽, 数据更新代价高, 可设置短有效期(数据更新不能实时生效)
  • 数据量比较大(key多)的数据适合使用统一缓存,比如 用户数据使用redis
  • 数据量小(Key少)适合使用本地缓存, 比如 车型数据使用 Yac
  • 实时性要求高的数据, 适合使用统一缓存,这样所有数据只有一份,清理的时候比较容易
  • 实时性要求低的数据, 且数据量小(key少) 适合使用本地缓存
  • value 比较大的, 读多写少, 且数据量小(key少)的数据,适合使用本地缓存, 减少网络开销
  • 使用本地缓存为了加速数据生效时间,可以引入配置中心保存 数据版本
    • 更新数据的时候同时更新配置中心
    • 每次获取都检查数据版本, 版本更新则刷新缓存数据

你可能感兴趣的:(redis基础)