Redis数据存储格式:

Redis自身是一个Map,其中所有的数据都是采用key:value的形式存储。

Redis常用命令:

功能 命令 范例
设置数据 set key value set name Tom
获取数据 get key get name
清屏 clear clear
获取帮助 help help
退出 quit/exit quit/exit

Redis数据类型(5种):

string类型数据的基础操作:

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

string类型数据的扩展操作:

数据库分表场景:
  • 设置数值数据增加指定范围的值
命令 范例(num初始值为”1”) 结果
incr key incr num num=”2”
incrby key increment incrby num 10 num=”12”
incrbyfloat key increment incrbyfloat num 1.5 num=”13.5”
  • 设置数值数据减少指定范围的值
命令 范例(num初始值为”15”) 结果
decr key decr num num=”14”
decrby key increment decrby num 10 num=”4”
  • string在Redis内部存储默认是一个字符串,当遇到增减类操作incr、decr时会转成数值类型进行计算。
  • Redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响。
  • 注意:按数值进行操作的数据,如果原始数据不能转成数值,或超越了Redis数值上限范围将报错。9223372036854775807(java中Long型数据最大值,Long.MAX_VALUE)
tips:
  • Redis用于控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性。
  • 此方案适用于所有数据库,且支持数据库集群。
设置数据生命周期:
  • 设置数据具有制定的生命周期
命令 范例 结果
setex key seconds value setex num 10 Tom 10秒后数据消失
psetex key milliseconds value psetex num 1000 Tom 1000毫秒后数据消失
tips:
  • Redis控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作。
string类型数据操作的注意事项:

数据操作不成功的反馈与数据正常操作之间的差异

①表示运行结果是否成功

  • (integer)0 —> false 失败

  • (integer)1 —> true 成功

②表示运行结果

  • (integer)3 —> 3 3个

  • (integer)1 —> 1 1个

  • 数据未获取到

    (nil)等同于null

  • 数据最大存储量

    512MB

  • 数值计算最大范围(java中long的最大值)

    ±9223372036854775807

key的设置约定

表名 :主键名 :主键值 : 字段名


hash类型数据的基础操作:

  • 添加/修改数据
单个数据操作 多个数据操作
hset key field value hmset key field1 value1 field2 value2…
  • 获取数据
单个数据操作 多个数据操作
hget key field hmget key field1 field2 …
hgetall key
  • 删除数据
hdel key field1 [field2]
  • 获取哈希表中字段的数量
hlen key
  • 获取哈希表中是否存在指定的字段
hexists key field

hash类型数据扩展操作

  • 获取哈希表中所有的字段名或字段值
命令
hkeys key
hvals key
  • 设置指定字段的数值数据增加指定范围的值
命令
hincrby key field increment
hincrbyfloat key field increment
hash类型数据操作注意事项
  • hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果未获取到数据,对应值为(nil)

  • 每个hash可以存储2^32-1

  • hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可将hash作为对象列表使用。

  • hgetall操作可以获取全部属性,如果内部field过多,遍历整体数据效率就会很低,有可能成为数据访问瓶颈。

    hash类型应用场景

    购物车订单场景

    以客户id作为key,每位客户创建一个hash存储结构对象。

    将商品编号作为field,购买数量作为value进行存储。

    设一个新的key,将所有商品基本信息独立存储在一个hash。

    将商品编号作为field,商品信息的json数据作为value进行存储。

    添加商品:追加全新的field与value

    浏览:遍历hash

    更改数据:自增/自减,设置value值

    删除商品:删除field

    清空:删除key

  • 如果当前对应的key中的field有值就什么都不做,如果没有值就添加

    hsetnx key field value

list类型数据的基础操作:

数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分。

需要的存储结构:一个存储空间保存多个数据,且通过数据可以提现进入顺序。

list类型:保存多个数据,底层使用双向链表存储结构实现。

  • 添加/修改数据

    | 命令 |
    | :—————————————: |
    | lpush key value1 [value2] …… |
    | rpush key value1 [value2] …… |

  • 获取数据
命令
lrange key start stop
lindex key index
llen key
  • 获取并移除数据
命令
lpop key
rpop key

list类型数据扩展操作

  • 规定时间内获取并移除数据
命令
blpop key1 [key2] timeout
brpop key1 [key2] timeout
  • 移除指定数据
lrem key count value

set类型数据的基础操作:

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

set类型数据的扩展操作

根据用户兴趣爱好推荐场景(操作随机数据)
  • 随机获取集合中指定数量的数据
srandmember key [count]
  • 随机获取集合中的某个数据并将该数据移出集合
spop key
set数据交并差操作
  • 求两个集合的交、并、差集
操作名称 命令
交集 sinter key1 [key2]
并集 sunion key1 [key2]
差集 sdiff key1 [key2]
  • 求两个集合的交、并、差集并存储到指定集合中
操作名称 命令 范例
key1与key2的交集存储到destination指定的集合中 sinterstore destination key1 [key2] sinterstore u3 u1 u2
key1与key2的并集存储到destination指定的集合中 sunionstore destination key1 [key2] sunionstore u3 u1 u2
key1与key2的差集存储到destination指定的集合中 sdiffstore destination key1 [key2] sdiffstore u3 u1 u2
  • 将指定数据从原始集合中移动到目标集合中
smove source destination  member
  • Tips:
    • redis 应用于同类信息的关联搜索,二度关联搜索,深度关联搜索。
    • 显示共同关注(一度)
    • 显示共同好友(一度)
    • 由用户A出发,获取到好友用户B的好友信息列表(一度)
    • 由用户A出发,获取到好友用户B的购物清单列表(二度)
    • 由用户A出发,获取到好友用户B的游戏充值列表(二度)
set类型数据操作的注意事项
  • set类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一份

  • set虽然与hash的存储结构相同,但是无法启用hash中存储值的空间


sorted_set类型数据的基础操作:

新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式

需要的存储结构:新的存储模型,可以保存可排序的数据

sorted_set类型:在set的存储结构基础上添加可排序字段

  • 添加数据
zadd key score1 member1 [score2 member2]
  • 获取全部数据
命令 获取顺序
zrange key start stop [WITHSCORES] 升序
zrevrange key start stop [WITHSCORES] 降序
  • 删除数据
zrem key member [member ...]
  • 按条件获取数据
命令 获取顺序 范例
zrangebyscore key min max [WITHSCORES] [LIMIT] 升序 zrangebyscore u1 50 80 withscores 或zrangebyscore u1 50 80 limit 0 3 withscores
zrevrangebyscore key max min [WITHSCORES] 降序 zrevrangebyscore u1 80 50 withscores
  • 按条件删除数据
命令 范例 删除方式
zremrangebyrank key start stop zremrangebyrank u1 0 1 按索引删除
zremrangebyscore key min max zremrangebyscore u1 50 80 按score删除

注意:

min与max用于限定搜索查询条件

start与stop用于限定查询范围,作用与索引,表示开始和结束的索引

offset与count用于限定查询范围,作用与查询结果,表示开始位置和数据总量

  • 获取集合数据总量
命令
zcard key
zcount key min max
  • 集合交、并操作
命令
zinterstore destination numkeys key [key …]
zunionstore destination numkeys key [key …]

sorted_set类型数据的扩展操作

  • 获取数据对应的索引(排名)
命令
zrank key member
zrevrank key member
  • score值获取与修改
命令 操作名称
zscore key member 获取
zincrby key increment member 修改
  • 获取当前系统时间
命令 结果
time 1)“1569575565” 2) “434277”
sorted_set类型数据操作的注意事项
  • score保存的数据存储空间是64位,如果 是整数范围是-9007199254740992~9007199254740992

  • score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时要慎重

  • sorted_set底层存储还是基于set结构,因此数据不能重复,如果重复添加相同数据,score值将被反复覆盖,保留最后一次修改结果