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 ...
实践
项目目标:
- 将原有的项目改变成 Hash 类型存储,key为 task:$id,field为 title、content、createtime
- 使用 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 代表最右侧倒数第二个元素
注意:
- 如果 start 大于 end,则返回空列表:(empty list or set)
- 如果 end 大于实际值,则返回至最右侧元素
- 无
RRANGE
命令
删除元素
// 删除 count 个值为 value 的元素
LREM key_name count value
实践
项目目标:
- 使用列表存储一份实际文章的 postid 清单,添加时同步添加,删除时同步删除
- 有两个好处,方便获取最新文章列表,方便分页截取
- 实现博客的分页
补充命令
获得/设置 指定索引的元素值
// 返回索引 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.png
实践 - 版本 v2.0
目标
- 全局任务编号依然为 task:count
- 定义一个任务清单为 task:list,当新增一个任务时添加,删除一个任务时弹出
- 任务系统的功能包含:新增、分页、更新和删除
- 使用 Hash 存储任务,其中key为 task:id:data,field为 title、content、important(A、B、C)、status(未完成(默认)、延期、完成)、summary
- 页面为:主页(list)、新增页(create)、详细页(detail)(使用 task:id 查看详细内容)、完成页(finish)
- 主页(list)每页显示 10 条记录,10 条记录以上时分页,并按时间倒排序
- 新增任务时,仅输入 title(文本框)、content(文本框)、important(下拉),status 默认为“未完成”,且不可见
- 进入详细页后,可更新任务状态并输入 summary
- 任务 status 为“完成”时,将任务转移至 task:finish:list 中,并可在完成页中查看
本作品采用《CC 协议》,转载必须注明作者和本文链接