236_Redis_数据类型_String_hash_List

举报
alexsully 发表于 2021/11/24 20:15:30 2021/11/24
【摘要】 常用类型 string list hash

Redis数据类型

  • String 字符类型
  • Hash 字典类型
  • List 列表
  • Set 集合
  • Zsort有序集合

1 String类型 类似ArrayList 动态字符串

内部结构为字符数组, 常见用途就是缓存用户信息, 将用户信息结构体使用JSON序列化成字符串,再存入Redis充当缓存, 获取用户信息有一次反序列化过程

  • String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串
  • 内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配
  • 内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len。当字符串长度小于1M时,扩容都是加倍现有的空间,
  • 如果超过1M,扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M

1.1  应用场景

  • session 共享
  • 常规计数:微博数,粉丝数,订阅、礼物, 传统对象缓存等

1.2 常用功能1  键值对 set、get、del、append、strlen

127.0.0.1:6379> set name1 alex # 设置值
OK
127.0.0.1:6379> get name1 # 获得key
"value1"
127.0.0.1:6379> del name1 # 删除key
(integer) 1

127.0.0.1:6379> exists name1 # 确保 key1 不存在
(integer) 0
127.0.0.1:6379> append name3 "hello" # 对不存在的 key 进行 APPEND ,等同于 SET
key1 "hello"
(integer) 5 # 字符长度

127.0.0.1:6379> get name2
"sully"
127.0.0.1:6379> APPEND name2 -003  # 对已存在的字符串进行 APPEND
(integer) 9 
127.0.0.1:6379> get name2
"sully-003"
127.0.0.1:6379> STRLEN name2  # 获取字符串的长度
(integer) 9

1.3 常用功能2 批量设置

# mset mget
# msetnx 当所有 key 都成功设置,返回 1

127.0.0.1:6379> mset k1 v2 k2 v2 k3 v3
OK

127.0.0.1:6379> mget k1 k2 k3
1) "v2"
2) "v2"
3) "v3"

127.0.0.1:6379> MSETNX k1 v11 k10 v10
(integer) 0

127.0.0.1:6379> get v10
(nil)

1.4 常用功能3 计数

# incr、decr 一定要是数字才能进行加减,+1 和 -1。
# incrby、decrby 命令将 key 中储存的数字加上指定的增量值
127.0.0.1:6379> set views 0 # 设置浏览量为0
OK
127.0.0.1:6379> incr views # 浏览 + 1
(integer) 1
127.0.0.1:6379> incr views # 浏览 + 1
(integer) 2
127.0.0.1:6379> decr views # 浏览 - 1
(integer) 1
127.0.0.1:6379> incrby views 10 # +10
(integer) 11
127.0.0.1:6379> decrby views 10 # -10
(integer) 1

1.5常用功能4 设定过期时间&判断是否存在

# setex(set with expire)键秒值
# setnx(set if not exist)
127.0.0.1:6379> setex key3 60 expire # 设置过期时间
OK
127.0.0.1:6379> ttl key3 # 查看剩余的时间
(integer) 55
127.0.0.1:6379> setnx mykey "redis" # 如果不存在就设置,成功返回1
(integer) 1
127.0.0.1:6379> setnx mykey "mongodb" # 如果存在就设置,失败返回0
(integer) 0
127.0.0.1:6379> get mykey
"redis"

1.6  常用功能5 range范围

# getrange 获取指定区间范围内的值,类似between...and的关系,从零到负一表示全部
# setrange 设置指定区间范围内的值,格式是setrange key值具体值

127.0.0.1:6379> GETRANGE name2 0 -1
"sully&003"
127.0.0.1:6379> SETRANGE name2 5 &
(integer) 9
127.0.0.1:6379> get name2
"sully&003"

1.7  常用6  传统对象缓存

set user:1 value(json数据)
# 可以用来缓存对象
127.0.0.1:6379> MSET user1:name alex user1:age 35
OK
127.0.0.1:6379> mget user1:name user1:age
1) "alex"
2) "35"


 hash类型(字典类型) kv模式不变,但V是一个键值对(MAP)

Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable

Hash 类型相当于 java的hashmap<String,Object>  (数组 + 链表的二维结构)

Redis hash是一个string类型的fieldvalue的映射表,hash特别适合用于存储对象   

通过 key(用户ID) + field(属性标签) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题

应用场景:

存储部分变更的数据,如用户信息等。最接近mysql表结构的一种类型,可以做数据库缓存

2.1 常用操作1 增删改

# hset、hget 命令用于为哈希表中的字段赋值 。
# hmset、hmget 同时将多个field-value对设置到哈希表中,会覆盖哈希表中已存在的字段。
# hgetall 用于返回哈希表中,所有的字段和值。
# hdel 用于删除哈希表 key 中的一个或多个指定字段
# hincrby 为哈希表中的字段值加上指定增量值。
# hsetnx 为哈希表中不存在的的字段赋值,不存在则成功写入,存在返回false 0

# hmset、hmget 同时将多个field-value对设置到哈希表中
127.0.0.1:6379> HMSET user2 name bob age 40 children 3 cars 2
OK
127.0.0.1:6379> HMGET user2 name age
1) "bob"
2) "40"

# hdel 用于删除哈希表 key 中的一个或多个指定字段
127.0.0.1:6379> HDEL user2 cars
(integer) 1
127.0.0.1:6379> HKEYS user2
1) "name"
2) "age"
3) "childrens"
4) "children"

# hincrby 为哈希表中的字段值加上指定增量值。
127.0.0.1:6379> HINCRBY user2 age 5
(integer) 45
127.0.0.1:6379> HGET user2 age
"45"

# hsetnx 为哈希表中不存在的的字段赋值,不存在则成功写入,存在返回false 0
127.0.0.1:6379> HSETNX user2 cars 20
(integer) 1
127.0.0.1:6379> HSETNX user2 age 39
(integer) 0


2.2 常用操作2

# hlen 获取哈希表中字段的数量
# hexists 查看哈希表的指定字段是否存在
# hkeys 获取哈希表中的所有域(field)。
# hvals 返回哈希表所有域(field)的值。

127.0.0.1:6379> hset user1 name alex age 35
(integer) 2
127.0.0.1:6379> HGET user1 name
"alex"
127.0.0.1:6379> HLEN user1
(integer) 2
127.0.0.1:6379> HKEYS user1
1) "name"
2) "age"
127.0.0.1:6379> HVALS user1
1) "alex"
2) "35"
127.0.0.1:6379> HEXISTS user1 high   #查询某个key/字段 0 代表false 
(integer) 0
127.0.0.1:6379> HEXISTS user1 name
(integer) 1

2.3 常用操作3 # hash特别适合用于存储对象。存储部分变更的数据,如用户信息等, String更适合字符串

select concat("hmset city_",id," id ",id," name ",name) from world.city limit 10 into outfile
'/data/backup/hmset.txt'
mysql ---> cannal ---> redis


3  列表List 所有命令都是l开头 不区分大小写

List 相当于 Java里的 LinkedList ,底层其实是 quicklist结构, 改结构是ziplist 压缩列表,所有的元素压缩在一起,分配连续内存存储,当数据量变大时候才会变成 quicklist,

Redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用, 这样既满足了快速的插入删除性能,又不会出现太大的空间冗余

应用场景

消息队列(左进右出), 栈结构(右进右出)

比如sina微博 微信朋友圈 最新的微博和朋友圈在Redis且一直更新 在一定范围内都是访问Redis,超出范围(start/count)后 才访问数据库, SQL数据库(或是硬盘上的其他类型数据库)只是在用户需要获取“很远”的数据时才会被触发

3.1 常用命令1 增删

# Lpush:将一个或多个值插入到列表头部。(左)
# rpush:将一个或多个值插入到列表尾部。(右)
# lrange:返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。
# 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。
# 也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

# lpop 命令用于移除并返回列表的第一个元素。当列表 key 不存在时,返回 nil
# rpop 移除列表的最后一个元素,返回值为移除的元素

# 右进左出 –模拟队列(先进先出)
127.0.0.1:6379> rpush list2 k1 k2 k3 k4 k5   #新加入的值在队列的尾部/ 往右边加入
(integer) 5
127.0.0.1:6379> LLEN list2
(integer) 5
127.0.0.1:6379> LPOP list2 # 左边弹出, 弹出的是K1
"k1"

# 右进右出 –模拟栈(先进后出)
127.0.0.1:6379> RPUSH list3 k1 k2 k3 k4
(integer) 4
127.0.0.1:6379> LLEN list3
(integer) 4
127.0.0.1:6379> RPOP list3
"k4"


3.2常规操作2 lindex相当于 链表的 get(int index) 方法, 需要遍历链表, 性能随着index增大而增大

# Lindex,按照索引下标获得元素(-1代表最后一个,0代表是第一个)
# llen 用于返回列表的长度
127.0.0.1:6379> LRANGE list3 0 -1
1) "k1"
2) "k2"
3) "k3"
127.0.0.1:6379> LINDEX list3 1
"k2"
127.0.0.1:6379>


3.3 常规操作3

# ltrim  类似截取保留, 参数 start_index , end_index 区间内保留,其余都砍掉
# lrem key 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素
# lset key index value 将列表 key 下标为 index 的元素的值设置为 value
# linsert key before/after pivot value 用于在列表的元素前或者后插入元素
# rpoplpush  <key1><key2>从<key1>列表右边吐出一个值,插到<key2>列表左边。
127.0.0.1:6379> LTRIM list3 1 -1
OK
127.0.0.1:6379> LRANGE list3 0 -1
1) "k2"
2) "k3"

lrem key 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素
127.0.0.1:6379> LPUSH list2 k2 k2 k2
(integer) 6
127.0.0.1:6379> LRANGE list2 0 -1
1) "k2"
2) "k2"
3) "k2"
4) "k2"
5) "k3"
6) "k5"
127.0.0.1:6379> LREM list2 2 k2
(integer) 2
127.0.0.1:6379> LRANGE list2 0 -1
1) "k2"
2) "k2"
3) "k3"
4) "k5" 

# lset key index value 将列表 key 下标为 index 的元素的值设置为 value
127.0.0.1:6379> LSET list2 1 k22
127.0.0.1:6379> LRANGE list2 0 1
1) "k2"
2) "k22"

# linsert key before/after pivot value 用于在列表的元素前或者后插入元素
127.0.0.1:6379> LINSERT list2 before k22 k21
(integer) 5
127.0.0.1:6379> LRANGE list2 0 2
1) "k2"
2) "k21"
3) "k22"


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。