Redis学习笔记(二):数据类型和通用操作命令

Redis学习笔记系列

  • Redis学习笔记(一):下载与安装-Windows、Linux
  • Redis学习笔记(二):数据类型和通用操作命令
  • Redis学习笔记(三):Java连接Redis(Jedis)以及示例代码
  • Redis学习笔记(四):Redis持久化
  • Redis学习笔记(五):Redis事务-multi、exec、discard、锁、分布式锁、死锁
  • Redis学习笔记(六):删除策略、逐出算法
  • Redis学习笔记(七):redis高级数据类型及应用场景-Bitmaps、HyperLogLog、GEO
  • Redis学习笔记(八):redis主从复制-建立连接、数据同步、命令传播、复制缓冲区、复制偏移量、心跳机制
  • Redis学习笔记(九):哨兵模式-监控、通知、故障转移
  • Redis学习笔记(十):Redis集群-结构设计、集群搭建、集群操作、主从下线、主从切换
  • Redis学习笔记(十一):企业级解决方案-缓存预热、缓存雪崩、缓存击穿、缓存穿透、性能指标监控

redis支持的数据类型

  • string
  • hasd
  • list
  • set
  • sorted_set

redis自身是一个Map,其中的数据采用的都是key-value的形式存储,所有的key只有一种数据类型:string ,而上面所指的redis支持的数据类型,实际是value的数据类型


string

  • 存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
  • 存储数据的格式:一个存储空间保存一个数据
  • 存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用,但其本质还是字符串
  • redis所有操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发的影响

基本操作

添加/修改数据 set key value
获取数据 get key
删除数据 del key
添加/修改多个数据 mset key1 value1 key2 value2 ...
获取多个数据 mget key1 key2 ...
获取数据字符个数 strlen key
追加信息到原始信息后部(如果原始信息存在就追加,否则新建) append key value

扩展操作

数值操作

string在redis内部存储默认就是一个字符串,当遇到incr/decr时会转换称数值进行计算,当数值超过上限不能转换时,将报错,最大值为java中的long的最大值

key对应数值增加1 incr key
key对应数值减少1 decr key
key对应数值增加指定数字 incrby key amount
key对应数值增加指定小数 incrbyfloat key floatNum
key对应数值减少指定数字 decrby key amount

指定生命周期

redis控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作

设置某个key-value的有效秒数 setex seconds value
设置某个key-value的有效毫秒数 psetex milliseconds value

应用场景

用于控制数据库表主键id,为数据库表主键提供生成策略,保障数据表主键唯一性适用于所有数据库,且支持数据库集群
投票:限定四个小时只能投票一次

注意事项

  • 数据操作不成功的反馈于数据正常操作之间的差异
    1.表示运行结果是否成功
    (integer)0 -> false 失败
    (integer)1 -> true 成功
    2.表示运行结果值
    (integer)3 -> 数值3
    (integer)1 -> 数值1
  • 数据未获取到
    (nil) 等同于null
  • 数据最大存储量
    512MB
  • 数值计算最大范围
    JAVA中的Long的最大值9223372036854775807

hash

  • 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
  • 需要的存储结构:一个存储空间保存多个键值对数据
  • hash类型:底层使用哈希表结构实现数据存储
  • hash存储结构优化:如果field数量少,存储结构优化为类数组结构;如果field数量较多,存储结构使用HashMap结构
    Redis学习笔记(二):数据类型和通用操作命令_第1张图片

基本操作

添加/修改数据 hset key field value
获取数据 hget key field
获取所有数据 hgetall key
删除数据 hdel key field1 [field2]
添加/修改多个数据 hmset key field1 value1 field2 value2 ...
获取多个数据 hmget key field1 field2 ...
获取哈希表中字段的数量 hlen key
获取哈希表中是否存在指定的字段 hexists key field
往hash中添加数据,已经存在的则添加失败,不存在的则添加进去 hsetnx key field value

扩展操作

获取哈希表中所有的字段名 hkeys key
获取哈希表中所有的字段值 hvals key
设置指定字段的数值数据增加指定值 hincrby key field amount
设置指定字段的数值数据郑家指定小数 hincrbyfloat key field floatvalue

应用场景

电商网站的购物车
控制商品抢购,限购,限量,激活码等,商家id作为key,商品id为field,商品数量value

注意事项

  • hash类型下的value只能存储字符串,不允许存储其它数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil)
  • 每个hash可以存储( 2 32 − 1 2^{32}-1 2321)个键值对
  • hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切不可滥用,更不可将hash作为对象列表使用
  • hgetall操作可以获取全部属性,如果内部field过多,遍历整体数据效率会很低,有可能成为数据访问的瓶颈

list

  • 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
  • 需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序
  • list类型:保存多个数据,底层使用双向链表存储结构实现
    Redis学习笔记(二):数据类型和通用操作命令_第2张图片

基本操作

左边添加/修改数据 lpush key value1 value2 ...
右边添加/修改数据 rpush key value1 value2 ...
获取数据,从左开始获取,stop=-1时代表获取整个list的长度 lrange key start stop
获取某个下标的数据 lindex key index
获取list的长度 llen key
获取左边数据,并移除 lpop key
获取右边数据,并移除 rpop key

扩展操作

list中没有数据时,阻塞等待一段时间,当list中有值时取出list的值,或超时时取出(nil),并移除数据

取左值 blpop key1 key2 ... timeout
取右值 bropo key1 key2 ... timeout
从左边移除指定数据 (count:删除多少个, value删除哪个值) lrem key count value

应用场景

应用于具有操作先后顺序的数据控制
使用队列模型解决多路信息汇总合并的问题
使用栈模型解决最新消息的问题

注意事项

  • list中保存的数据都是string类型的,数据总容量是有限的,最多 2 32 − 1 2^{32}-1 2321个元素‘
  • list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作
  • 获取全部数据操作结束索引设置为-1
  • list可以对数据进行分页操作,通常第一页的信息来自于list,第二页及更多信息来自于数据库

set

  • 新的存储需求:存储大量的数据,在查询方面提供更高的效率
  • 需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
  • set类型:于hash存储结构完全相同,仅存储键,不存储值(nil),并且键是不允许重复的
    Redis学习笔记(二):数据类型和通用操作命令_第3张图片

基本操作

添加数据 sadd key member1 member2...
获取全部数据 smembers key
删除数据 srem key member1 member2...
获取集合数据总量 scard key
判断集合中是否包含指定数据 sismember key member

扩展操作

随机获取集合中指定数量的数据 srandmember key [count]
随机获取集合中的某个数据并将该数据移除集合 spop key [count]
两个集合的交集 sinter key1 key2...
两个集合的并集 sunion key1 key2...
两个集合的差集 sdiff key1 key2...
两个集合的交集并存储到指定集合中 sinterstore destination key1 key2...
两个集合的并集并存储到指定集合中 sunionstore destination key1 key2...
两个集合的差集并存储到指定集合中 sdiffstore destination key1 key2...
将指定数据从原始集合中移动到目标集合中 smove source destination member

应用场景

应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,热卖旅游线路,应用APP推荐,大V推荐等
应用于同类信息的关联搜索,二度关联搜索,深度关联搜索
应用于同类型不重复数据的合并操作,例如权限校验
应用于同类型数据的快速去重,例如记录网站访问量统计不同cookie数量或不同IP数量
应用于基于黑名单和白名单设定的服务控制

注意事项

  • set类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一份
  • set虽然与hash的存储结构相同,但是无法启用hash中存储值的空间

sorted_set

  • 新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式
  • 需要的存储结构:新的存储模型,可以保存可排序的数据
  • sorted_set类型:在set的存储结构基础上添加可排序字段
    Redis学习笔记(二):数据类型和通用操作命令_第4张图片

基本操作

添加数据 zadd key score1 member1 score2...
正序获取数据 zrange key start stop [WITHSCORES]
倒序获取数据 zrevrange key start stop [WITHSCORES]
删除数据 zrem key member1 member2...
正序按条件查询获取数据 zrangebyscore key min max [WITHSCORES] [LIMIT]
倒序按条件查询获取数据 zrevrangebyscoree key max min [WITHSCORES]
按排序条件删除数据 zremrangebyscore key min max
按索引下标删除数据 zremrangebyrank key start stop
获取集合数据总量 zcard key
获取某个范围的数据总量 zcount key min max
集合交集操作 zinterstore destination numkeys key1 key2...
集合并集操作 zunionstore destination numkeys key1 key2...

扩展操作

正序获取数据对应的索引 zrank key member
倒序获取数据对应的索引 zrevrank key member
获取score的值 zscore key member
修改score的值 zincrby key increment member

应用场景

应用于定时任务执行顺序管理或任务到期管理
应用于即时任务/消息队列执行管理,即带有权重的任务列表

注意事项

  • min与max用于限定搜索查询的条件
  • start与stop用于限定查询范围,作用于索引,表示开始和结束索引
  • offset与count用于限定查询范围,作用于查询结构,表示开始位置和数据总量
  • score保存的数据存储空间是64位
  • score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时要慎重
  • sorted_set底层存储还是基于set结构的,因为数据不能重复,如果重复添加相同的数据,score值将被反复覆盖,保留最后一次修改的结果

redis实践案例

  • 应用于限时按次结算的服务控制,比如某个接口,试用版用户每分钟最多只能调用10次等
  • 应用于基于时间顺序的数据操作,而不关注具体时间

通用操作命令

key通用操作

删除指定的key del key
获取key是否存在 exists key
获取key的类型 type key
为指定的key设置有效期

expire key seconds
pexpire key milliseconds
expireat key timestamp
pexpireat key milliseconds-timestamp

获取key的有效时间,如果key为永久性的,则返回-1

ttl key
pttl key

切换key从时效性转换为永久性 persist key
通过正则获取所有的key keys pattern
为key改名 ,如果newkey已经存在,则覆盖rename key newkey
为key改名,如果newkey存在则改名失败 renamenx key newkey
对所有key排序 sort
其它key通用操作的其它操作命令 help @general

数据库通用操作

redis为每个服务提供了16个数据库,编号:0-15,每个数据库之间的数据相互独立,这样可以解决多个相同的key可以按照分区放到不同的redis数据库编号中,redis默认使用编号为0的数据库

切换数据库 select index
数据移动 move key db
数据清除操作

查看当前分区的key的数量:dbsize
清除当前分区的数据:flushdb
清除所有分区的数据:flushall

其它操作

quit
ping
echo message

其它操作

获取当前系统时间 time


- 捐赠 -


如果觉得还不错,请我喝杯水吧 ^ _ ^ 您的鼓励是我不断前进的动力,如果有错误的地方,欢迎提出批评改正意见,戳我,感谢您的支持

支付宝 微信

你可能感兴趣的:(Redis学习笔记系列)