redis 最常应用于各种结构类型和非结构类型高热度数据的访问加速。在本文,我们将从 redis 中 string 数据类型开始了解 redis 对数据的存取操作。

redis 最常应用于各种结构类型和非结构类型高热度数据的访问加速。在本文,我们将从 redis 中 string 数据类型开始了解 redis 对数据的存取操作。本文是该系列的第四篇原创笔记,如果你还没阅读之前的部分,可以通过以下链接进行阅读

  • 01-redis入门知识第1篇-redis简介
  • 02-redis入门知识第2篇-redis的安装与测试
  • 03-redis入门知识第3篇-redis的基本操作与数据类型

1. string 类型的特征

  • 存储的数据:单个数据,最简单的数据类型,也是最常用的存储类型
  • 存储数据的格式:一个存储空间保存一个数据
  • 存储空间:通常使用字符串,如果存储的字符是数值的形式,可以使用数值操作(比如增加指定值、减少指定值)的功能

2. string 类型的基本操作

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

如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾。

append key value

3. 单数据操作 与 多数据操作的对比

3.1. 指令

  • 设置单条数据:set key value
  • 设置多条数据:mset key1 value1 key2 value2

3.2. 操作时间差

假设每执行一个动作需要一个时间单位,那么执行一次命令,需要的时间单位为:发送执行命令(往)的时间 + 执行的时间 + 返回结果(返)的时间,一共需要 3 个时间单位。

  • 单数据操作,执行 3 条指令的执行过程:往返 6 个单位 + 执行 3 个
  • 多数据操作,执行 3 条指令的执行过程:往返 2 个单位 + 执行 3 个

4. string数值类型数据的操作

设置数值数据增加指定的值

# 对key的值增加1个单位
incr key
# 指定对key的值增加increment个单位
incrby key increment
# 指定对key的值增加increment值,increment可以是float类型的值
incrbyfloat key increment

设置数值数据减少指定的值

# 对key的值减少1个单位
decr key
# 指定对key的值减小increment个单位
decrby key increment
  • string 在 redis 中内部存储默认就是一个字符串,当遇到增减类操作 incr,decr 时会转成数值型进行计算。
  • redis 所有的操作都是原子性的,采用单线程处理所有的业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响。

注意:按数值进行操作的数据,如果原始数据不能转成数值,或超越 redis 数值的上限范围,将会报错。
redis中数值数据最大值为 9223372036854775807(java 中 long 型数据的最大值,Long.MAX_VALUE)

在大型企业级应用中,因为大量的数据,所以通常使用分表的方式存储数据。在使用多张表存储同类型数据中,对应的主键 id 必须保证统一性,不能重复。Oracle 数据库具有 sequence 设定,可以解决该问题,但是 MySQL 数据库并不具有此类机制。那么我们就可以通过 string 数值类型的增加操作获得下一个值,再作为关系数据库中的主键值。

5. 设置string类型数据的有效期

以下有几个例子:

(1):“最强女生”启动海选投票,只能通过微信投票,每个微信号每 4 个小时只能投 1 票。

(2):电商商家开启热门商品推荐,热门商品不能一直处于热门期,每种商品热门期维持 3 天,3 天后自动取消热门。

(3):新闻网站会出现热点新闻,热点新闻最大的特征是实效性,如何自动控制热点新闻的时效性。

  • 解决方案:设置数据具有指定的生命周期
# 以秒为单位设置key的值
setex key seconds value
# 以毫秒为单位设置key的值
psetex key millisenconds value
  • 查看key有生命周期的数据
# 以秒为单位查询key剩余的生命周期
ttl key
# 以毫秒为单位查询key剩余的生命周期
pttl key

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

6. redis 操作反馈

数据类型操作不成功的反馈与数据正常操作的反馈的有查询,如下

  1. 表示运行结果是否成功

(integer)0 -> false 失败
(integer)1 -> true 成功

  1. 表示结果值

(integer)3 -> 3 个
(integer)1 -> 1 个

  1. 表示数据未获取到

(nil)等同于 null

数据最大存储量为512m,而数值计算最大范围(java 中的 long 的最大值)为-9223372036854775807 到 9223372036854775807

7. redis中key的命名建议

redis用于缓存热点数据,但数据最终存储在数据库中,redis一般用于关系型数据库中的数据缓存。所以在给缓存key命名时最好要语意化,规范化。如下列 key -> value 键值对例子。

  • 用户的粉丝数:user:id:100:fans -> 123355
  • 用户的博客数:user:id:100:blogs -> 99
  • 用户的关注数:user:id:100:focus -> 83

上面的示例是存储用户的单个字段信息,在实际中,我们可以需要存储用户的完成信息,那么中通常以 json 格式存储用户信息,如下 key -> value 示例

  • 用户的信息:user:id:100 -> {"id":100,"name":"春晚","fans":12355,"blogs":99,"focus:83}