236_Redis_数据类型_String_hash_List
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"
2 hash类型(字典类型) kv模式不变,但V是一个键值对(MAP)
Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable
Hash 类型相当于 java的hashmap<String,Object> (数组 + 链表的二维结构)
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 <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"
- 点赞
- 收藏
- 关注作者
评论(0)