Redis 入门 - 2(散列 + 列表)

继续 Redis 入门的 Day - 2。这次将学习 Redis 的两个最最基本的结构化数据类型

散列

散列,是种“键 + 字段 + 字段值”的数据结构。实际应用上,可以用它将一个“大块”的内容,分割为一个个的“小块”内容,进而提高效率和性能,减少运行时的资源浪费

所有散列命名均以 “H” 开头

基础命令

设定与获取

// 设定散列的 key + field + value

// 注意:field_value 只能是字符串,当然不支持类型嵌套
HSET key_name field_name field_value

// 获取散列的 key with field
HGET key_name field_name

批量设定与批量获取

// 批量设定
HMSET key_name field_name1 field_value1 field_name2 field_value2 ...

// 批量获取
HMGET key_name field_name1 field_name2 ...

获取全部

// 获取 key_name 下的全部 fields 和 values
HGETALL key_name

判断字段是否存在

// 存在返回 1,否则返回 0(包括键不存在或字段不存在)
HEXISTS key_name field_name

当字段不存时设定

// 不存在则设定 返回 1;存在则什么也不做,返回 0
HSETNX key_name field_name field_value

增加数字

// 返回(Integer)增加后的数值。如果字段不存在,则创建,返回 1
HINCRBY key_name field_name 每次递增的数值

删除字段

HDEL key_name field_name1 field_name2 ...

实践

项目目标:

  1. 将原有的项目改变成 Hash 类型存储,key为 task:$id,field为 title、content、createtime
  2. 使用 postid 可以查看 task 详细内容的链接

补充命令

只获取字段名或字段值

// 获取 key_name 下的所有字段名
HKEYS key_name

// 获取 key_name 下的所有字段值
HVALS key_name

获取字段数量

// 返回字段的数量
HLEN key_name

列表

存储一个有序字符串列表,为双向链表,越接近两端的元素读取速度越快。实际应用上,可以用来表示“最新的XXX”、“新鲜事”、“日志”等场景,以突出列表的链表优势

基础命令

增加元素

// 这里的 key_name 可以理解为 list_name

// 向左边添加元素,返回增加元素后的列表长度(该命令具备批量添加)
LPUSH key_name value [value ...]

// 向右边添加元素,返回增加元素后的列表长度(该命令具备批量添加)
RPUSH key_name value [value ...]

注意:多个 values 时,则顺次添加,且可以有相同 value 值

弹出元素

注意:“弹出”后,该元素将从列表中消失。执行步骤为:先从列表中移除元素,后返回该元素。

// 从左边移除一个元素,返回列表值
LPOP key_name

// 从右边移除一个元素,返回列表值
RPOP key_name

可以实现栈和队列的功能:

// 栈(Strack)
LPUSH my_strack A B C
LPOP my_strack  // C 弹出

// 队列(Queue)
LPUSH my_queue A B C
RPOP my_queue   // A 弹出

获取元素个数

// 返回列表的长度
LLEN key_name

获取列表片段

// 返回 start 至 end 间的所有元素,包括 end
LRANGE key_name start end   

同时,也支持负索引,表示从右侧开始计算序列。 -1 代表最右侧元素,-2 代表最右侧倒数第二个元素

注意:

  1. 如果 start 大于 end,则返回空列表:(empty list or set)
  2. 如果 end 大于实际值,则返回至最右侧元素
  3. RRANGE 命令

删除元素

// 删除 count 个值为 value 的元素
LREM key_name count value

实践

项目目标:

  1. 使用列表存储一份实际文章的 postid 清单,添加时同步添加,删除时同步删除
  2. 有两个好处,方便获取最新文章列表,方便分页截取
  3. 实现博客的分页

补充命令

获得/设置 指定索引的元素值

// 返回索引 index 处的 value
LINDEX key_name index

这样就可以将 list 当做数组来使用

// 将索引为 index 的值设定为 value
LSET key_name index value

只保留列表指定片段

// 用法同 LRANGE,但只保留指定范围内的元素
LTRIM key_name start end

可以用来实现日志的管理,例如“动态日志”,只保留100条最新的动态日志记录,就可以:

LPUSH logs value
LTRIM logs 0 100

向列表中插入元素

// 先查找 find_value 的元素,再根据 BEFORE|AFTER 在 find_value 前或后插入 set_value 值,返回调整后的列表元素个数
LINSERT key_name BEFORE|AFTER find_value set_value

将元素从一个列表转到另一个列表

// 从 form_key_name 列表的最右侧弹出一个元素,再在最左侧添加至 to_key_name 列表中
RPOPLPUSH from_key_name to_key_name

总结

Redis-2.pngfile

实践 - 版本 v2.0

目标

  1. 全局任务编号依然为 task:count
  2. 定义一个任务清单为 task:list,当新增一个任务时添加,删除一个任务时弹出
  3. 任务系统的功能包含:新增、分页、更新和删除
  4. 使用 Hash 存储任务,其中key为 task:id:data,field为 title、content、important(A、B、C)、status(未完成(默认)、延期、完成)、summary
  5. 页面为:主页(list)、新增页(create)、详细页(detail)(使用 task:id 查看详细内容)、完成页(finish)
  6. 主页(list)每页显示 10 条记录,10 条记录以上时分页,并按时间倒排序
  7. 新增任务时,仅输入 title(文本框)、content(文本框)、important(下拉),status 默认为“未完成”,且不可见
  8. 进入详细页后,可更新任务状态并输入 summary
  9. 任务 status 为“完成”时,将任务转移至 task:finish:list 中,并可在完成页中查看
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!