236_Redis_数据类型_String_hash_List

网友投稿 530 2022-05-29

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 设定过期时间&判断是否存在

236_Redis_数据类型_String_hash_List

# 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"

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

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

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

Redis hash是一个string类型的field和value的映射表,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 列表右边吐出一个值,插到列表左边。 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"

Redis 数据结构

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SVN 客户端基本用法
下一篇:华为宣布启动数据基础设施战略并开源数据虚拟化引擎HetuEngine
相关文章