概述
redis的key
主要有设置生存时间 过期时间 存在 删除 改名
ttl 查看生存时间 rename 改名 type key 查看类型 del 删除
每个命令都是原子的
应用场景
手机验证码 过期 商品促销 限制访问的次数
key的命名规范
非关系型数据库的数据之间没有关联 所以key要保持规范 来确定之间的关系
- key不要太长 最好不要超过1024字节 太长了不仅消耗内存 而且降低查找的效率
- 不要太短 没有可读性
- 在一个项目中 使用统一的命名格式 例如user:123:password 来表示key之间的关联性 使用冒号来分隔
- 区分大小写
string类型
string 数据类型 是最简单的 不仅是字符串 也可以是数字 等很多种类型的特殊类型 二进制安全 可以是图片的码流
set key value 设置key的值 多次设置会覆盖
setnx 如果不存在 设置 返回1 如果存在 就不设置 返回0
setex key 10 lixin 设置key的值为lixin 10s后过期
del keyname 删除指定的key 如果存在 返回数字类型
GETSET key value 用于设定key的值 并且返回key的旧值 当key不存在 返回nil
STRLEN 返回字符串的长度
mset k1 v1 v2 v3 批量写
mget k2 v1 v2 v3 批量读
incr key 1 如果不存在 一样增加
decr key
incrby key num 将key的值增加num
string的应用场景
- 通常用于保存单个字符串或json的值
- 因为string是安全的 可以把图片作为string存储
- 计数器 微博数字 粉丝数字
hash类型
hash类型是string类型的field和value的映射表 适用于存储对象 比储存会String类型占用更少的空间
hset key field value 单个赋值
hmset key field1 value1 field2 value2 可以存多个值
hget key field 取出单个
hmget key field1 field2
list类型
lpush 从左边添加 a b c d e ⇒ e d c b a
rpush 从右边添加 a b c d e ⇒ e d c b a
lrange key 0 -1 遍历全部的数据 -1表示倒数第一 -2 倒数第二
lpop 左删除
rpop 右删除
b开头的删除 表示无数据阻塞
修改指令
lset key index value 设置key的索引
linsert key before|after index value 在某个索引之前或后面 添加值
高级命令
rpoplpush source destination 移除列表的最后一个元素 添加到另一个的左边
zset 一些指令
是一个有序的string类型的集合 不允许重复的成员
add key score1 value1 添加一个成员 或者 多个
zcard key 找到key代表的set的size
zrange key 0 -1 从低到高 显示
zcount 60 90 查看指定范围的数量
应用场景
排行榜 时间大小
可以用score 来做带权重的队列
HyperLogLog 基数类型
用来做基数统计 在输入的元素数量很大是 占用的空间总是固定的 因为只会记录元素的基数 不会记录本身的值
pfadd key 1 2 3 4 53 4 4 45 55
pfcount key 计算大小
pfmerge source destination 将多个合并为一个
redis事务
每个命令都是原子性的
执行一组命令需要事务 不支持事务回滚
mutil 开启事务
exec 执行
discard 放弃执行
redis事务。如果命令错误 只会执行不错误的 不会回滚全部
watch
watch 当一个进程 watch 某个key 再去执行事务
当其他进程改变了这个key 执行不会成功
事务应用场景
需要执行一组命令的时候 需要事务
redis 持久化
- RDB 默认的持久化 将内存的数据 以快照的方式写入二进制文件 dump.rdb.
优点 保存数据快 恢复数据快
save 900 1
save 300 10 //300秒之内 10个key发生变化 快照
缺点 没到时间 丢失数据 - AOF
append only file
比快照方式 有更好的持久化性,redis 会将每一个收到的写命令都通过write函数 追加到文件中 当重启的时候也会重新执行写命令恢复
redis与mysql 实时同步
查询缓存查询不到 再从mysql中查询 保存到缓存
更新缓存的时候 先更新数据库 再去设置缓存过期
@Cacheable 查询时使用 long类型需转换为String类型 否则异常
@Cacheput 更新时使用 使用此注解 会从DB查询
@CacheEvict 删除时使用
@Cache
缓存穿透
查询一个根本不存在的数据,由于缓存在不命中的时候需要在数据库查询,查询不到就不写缓存,将导致每次都要去数据库查询,造成了缓存的穿透
解决办法:
持久层如果查不到就去缓存空结果,查询的时候先去判断缓存中是否 exist(key),如果有 直接返回,没有就查询后返回。当insert时,即进入key的持久化时,需要设置缓存失效。
缓存雪崩
如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询菌落在数据库上,造成雪崩。
解决方案:
考虑用加锁的方式,保证缓存单线程(进程)写,避免失效时,大量的并发落在数据库。
加锁排队,限流算法,令牌桶,leaky bucket
最后
以上就是活力战斗机为你收集整理的Redis数据类型 和 基本使用 (2)的全部内容,希望文章能够帮你解决Redis数据类型 和 基本使用 (2)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复