基本类型
字符串(String),哈希(Hash),列表(List),集合(Set),有序集合(Sorted Set)
1. 字符串(String)
概述
字符串是 redis中最基本的数据类型。每个键都可以关联一个字符串值,这个值可以是任何类型的数据,如文本、数字或序列化的对象。
基础命令
set key value [EX seconds] [PX milliseconds] [NX|XX]EX:设置键的过期时间为 second 秒PX:设置键的过期时间为 millisecond 毫秒NX:只在键不存在时,才对键进行设置操作。XX:只在键已经存在时,才对键进行设置操作。
命令示例
## 设置我的登录账号为张三 key=username value="zhangsan"
set username "zhangsan"## 设置zhangsan的密码为zhangsan888 并设置60秒后过期
set password "zhangsan888" EX 60## 获取zhangsan的用户名
get username ## 张三的密码
get password ## 查询张三的密码过期时间
ttl password## 删除张三用户名密码
del username
del password
运行示例
注意事项
- 为了避免每个人/每个租户/ 造成 key 覆盖问题 , 项目开发必需统一命名规范
- (例如) tenantId:userId:username=张三
- 字符串类型的值最大可以存储512MB的数据。
2. 哈希(Hash)
概述
哈希类型在 redis中用于存储对象。一个哈希类型的键关联了一个键值对集合,其中每个键值对都是一个字段和值的组合, Java语言的HashMap,内部实现结构上底层通过数据+链表实现
基础命令
get <key> 查询对应键值setnx <key> <value> 当key不存在时设置key的值incr <key> 将key的数字值增1, 如果为空新增值为1decr <key> 将key的数字值减1, 如果为空新增值为-1#EX:设置键的过期时间为 second 秒
#PX:设置键的过期时间为 millisecond 毫秒
#NX:只在键不存在时, 才对键进行设置操作
#XX:只在键已经存在时,才对键进行设置操作
set key value [EX seconds] [PX milliseconds] [NX|XX]
命令示例
# 存储张三的信息 用户1:
hset user:1 username "zhangsan" password "zs888" age 18# 获取哈希键中所有的字段和值
HGETALL user:1# 获取张三用户名信息
HGET user:1 username
运行示例
注意事项
- HSET 命令不区分插入和更新操作,这意味着修改数据时不用事先判断字段是否存在来决定要执行的是插入还是更新操作。
3. 列表(List)
概述
列表类型是一个有序的集合 ,类似于LinkedList底层实际是个双向链表,列表中的每个元素都有一个索引,可以根据索引进行访问和操作。列表类型支持在头部和尾部进行元素的插入和删除操作,可以实现队列、栈等数据结构
优点:插入性能高,缺点:随机读性能差 LinkedList.get(100),因为他需要遍历这个链表,从头开始遍历这个链表,直到找到index = 100 的这个元素为止。
基础命令
#从左边/右边插入一个或多个值
lpush/rpush <key> <value1> <value2> <value3> #从左边/右边移除一个值
lpop/rpop <key> #0左边第一个, -1右边第一个 (0-1表示获取所有)
lrange mylist 0 -1 #按照索引下标获得元素(从左到右)
lrange <key> <startIndex> <stopIndex> #按照索引下标获得元素(从左到右)
lindex <key> <index> #获得列表长度
llen <key>
命令示例
# 将abc从左边插入 left
lpush userlist "a"
lpush userlist "b"
lpush userlist "c"# 将xyz从右边插入 right
rpush userlist "x"
rpush userlist "y"
rpush userlist "z"# 查询所有
lrange userlist 0 -1# 移除最左边的一个
lpop userlist# 移除最右边的一个
rpop userlist
# 查询所有
lrange userlist 0 -1
运行示例
注意事项
- 列表类型的元素可以重复
- 当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收
- 堆:先进先出 水管模式 , 栈:先进后出 弹夹模式
4. 集合(Set)
概述
Set是通过哈希表的方式来实现的, 集合类型是一个无序、集合中的元素没有重复,当我们向一个 Set中添加元素时,redis会通过哈希函数将元素的值转化为一个哈希值 , 键是唯一的,每个键对应一个值。
基础命令
#将一个或多个member元素加入到集合 key中
sadd <key> <value1> <value2> #取出该集合的所有值
smembers <key>#判断集合<key>是否为含有该<value>值 有1,没有0
sismember <key> <value> #返回该集合的元素个数
scard <key>#删除集合中的某个元素
srem <key> <value1> <value2>#返回两个集合的交集元素
sinter <key1> <key2>#两个集合的并集元素
sunion <key1> <key2>#返回两个集合的差集元素
sdiff <key1> <key2>
命令示例
# 向集合添加一个成员
sadd myset1 "a" "b" "c" "d"
sadd myset2 "a" "e" "c"# 从集合中移除一个成员
srem myset1 "d"#返回两个集合的交集元素
sinter myset1 myset2# 获取集合中的所有成员
smembers myset1
运行示例
注意事项
- 集合类型的元素是无序的,不支持按索引访问。
- 集合类型是通过哈希表实现的,操作具有高效的性能,可以快速执行集合运算
5. 有序集合(Sorted Set)
概述
有序集合类型是一个有序的集合,底层的存储的每个数据都包含element和score两个值。score是得分,element则是字符串值。SortedSet会根据每个element的score值排序,形成有序集合。
要实现根据element查询对应的score值,就必须实现element与score之间的键值映射。SortedSet底层是基于HashTable来实现的。
基础命令
###语法
zadd key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]#将一个或多个 member元素及其 score值加入到有序集 key当中
zadd <key> <score1> <value1> <score2> <value2>#返回key中,下标在sindex-stopindex之间的元素,
#带 WITHSCORES可以让分数一起和值返回到结果集
zrange <key> <start> <stop> [WITHSCORES]#返回key中,介于min和max之间(包括边界值)的成员。从小到大排列
zrangebyscore key min max [withscores] [limit offset count] #从大到小排列
zrevrangebyscore key max min [withscores] [limit offset count]#删除该集合下,指定值的元素
zrem <key> <value>#统计该集合,分数区间内的元素个数
zcount <key> <min> <max>
命令示例
# 向有序集合添加一个成员,并指定其分数
zadd myzset 1 "a" 5 "b" 7 "c" 8 "d"# 从有序集合中移除一个成员
zrem myzset "d"# 获取有序集合中指定范围内的成员
zrange myzset 0 -1# 获取有序集合中指定成员的分数
zrangebyscore myzset 5 7
运行示例
注意事项
- 有序集合类型的元素按照分数进行排序,可以根据分数范围快速获取成员。
- 有序集合类型的操作具有高效的性能,可以快速执行排序和排名相关的操作。