redis学习day03---list列表和hash

it2025-03-31  6

一、list列表 1.list列表 基于linked list实现 元素是字符串类型 列表头尾增删快,中间增删慢,增删元素是常态 元素可以重复实现 最多包含2^32-1元素 2.列表的索引 从左至右,从0开始 从右至左,从-1开始 3.命令 (1)命令说明 B block 块,阻塞 L left 左 R right 右 X exist 存在 (2)左右或者头尾压入元素 lpush key value [value ..] lpushx key value rpush key value [value ...] rpushx key value (3)左右或者头尾弹出元素 lpop key rpop key (4)从一个列表尾部弹出元素并压入到另一个列表的头部 rpoplpush source destination (5)返回列表中指定范围元素 lrange key start stop lrange key 0 -1 表示返回所有元素 (6)获取指定位置的元素 lindex key index (7)设置指定位置元素的值 lset key index value (8)列表长度,元素个数 llen key (9)从列表头部开始删除值等于value的元素count次 lren key count value count>0:从头开始向表尾搜索,移除与value相等的元素,数量为count count<0:从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值 count=0:移除表中所有与value相等的值 举例: RPUSH listkey c abc c ab 123 ab bj ab redis list LREM listkey 2 ab LRANGE listkey 0 -1 (10)去除指定范围外元素 ltrim key start stop 举例: RPUSH listkey c abc c ab 123 ab bj ab redis list LREM listkey 2 ab LRANGE listkey 0 -1 微博的评论最后500条 ltrim u1234:forumid:comments 0 499 (11)在列表中某个存在的值(pivot)前或后插入元素 linsert key before|after pivot value key和pivot不存在,不进行任何操作 举例: RPUSH lst Clojure C Lua LINSERT lst AFTER C Python LINSERT lst BEFORE C Ruby (12)阻塞 如果弹出的列表不存在或者为空,就会阻塞 超出时间设置为0,就是永久阻塞,直到有数据可以弹出 如果多个客户端阻塞在同一个列表上,使用first in first service原则,先到先服务 (13)左右或者头尾阻塞弹出元素 blpop key [key ...] timeout brpop key [key ...] timeout (14)从一个列表尾部阻塞弹出元素压入到另一个列表的头部 brpoplpush source destination timeout 二、hash散列 1.hash散列 由field和关联的value组成的map键值对 field和value是字符串类型 一个hash中最多包含2^32-1键值对 2.命令 (1)设置单个字段 hset key field value hsetnx key field value key的field不存在的情况下执行,key不存在直接创建 (2)设置多个字段 hmset key field value [field value ...] (3)返回字段个数 hlen key (4)判断字段是否存在 hexists key field key或者field不存在,返回0 (5)返回字段值 hget key field (6)返回多个字段值 hmget key field [field ...] (7)返回所有的键值对 hgetall key (8)返回所有字段名 hkeys key (9)返回所有值 hvals key (10)在字段对应的值上进行整数的增量计算 hincrby key field in increment (11)在字段对应的值上进行浮点数的增量计算 hincrbyfloat key field increment (12)删除指定的字段 hdel key field [field ...] 举例: HINCRBY numbers x 100 HINCRBY numbers x -50 HINCRBYFLOAT numbers x 3.14 HDEL numbers 3.hash用途 (1)节约内存空间 (2)没创建一个键,它都会为这个键储存一些附加的管理信息(比如这个键的类型,这个键最后一次被访问的时间等等) (3)所以数据库里面的键越多,redis数据库服务器在储存附加管理信息方面耗费的内存就越多,花在管理数据库键上的CPU也会越多在字段对应的之上进行分浮点数的增量计算 (4)不适合hash的情况 a:使用二进制位操作命令:因为redis目前支持对字符串键进行setbit、getbit、bitop等操作,如果你想使用这些操作,那么只能使用字符串键,虽然散列也能保存二进制数据 b:使用过期键功能:redis的键过期功能目前只能对键进行过期操作,而不能对散列的字段进行过期操作,因此如果你要对键值对数据使用过期功能的话,那么只能把键值对储存在字符串里面。 4.案例 微博的好友关注 用户ID为key,Field为好友ID,Value为关注时间 user:1000 user:606 20150808 用户维度统计 统计数包括:关注数、粉丝数、喜欢商品数、发帖数 用户为Key,不同维度为Field,Value为统计数 比如关注了5人 HSET user:100000 follow 5 HINCRBY user:100000 follow 1
最新回复(0)