一、redis 数据类型
1、redis 五大数据类型
1️⃣ String(字符串)
String 类型是 redis 最基本的数据类型。string 类型是二进制安全的,意思是 redis 的 string 可以包含任何数据,比如 Jpg 图片或者序列号对象。一个 redis 中字符串 value 最多可以是 512 M
2️⃣ Hash(哈希,类似 java 里面的 map)
Redis hash 是一个键值对集合,是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象
3️⃣ List(列表)
redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或尾部(右边)它的底层实际是个链表
4️⃣ Set(集合)
redis 的 set 是 string 类型的无序集合
5️⃣ Zset(sorted set 有序的集合)
redis zset 和 set 一样也是 string 类型元素的集合,且里面元素不允许重复。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。zset 的成员是唯一的,但分数却可以重复。
2、redis 命令文档
http://redisdoc.com/
3、redis 键(key)
1、keys * 查看当前库中所有的 key
2、exists keyname 判断某个 key 是否存在
3、move keyname dbnum 把当前库中的 keyname 这个 key 移动到 dbnum 这个库里面
4、expire keyname 秒钟 为给定的 key 设置过期时间
5、ttl keyname 查看还有多少秒过期,-1 表示永不过期 -2 表示已过期
6、type keyname 查看你的 key 是什么类型
4、redis 字符串(String)
set k1 v1 设置 key 为 k1 值为 v1
get k1 获取 k1 的值
del k1 删除 k1
append k1 abc 在 k1 的值后面追加 abc(得到的结果就是 v1abc)
strlen k1 返回 k1 值的长度
incr k1 假设 k1 的值是 2,那么你执行这个命令就会把 k1 的值递增 1,再执行一次再递增 1
decr k1 执行这个命令会把 k1 的值递减 1
incrby k1 3 执行这个命令会把 k1 的值递增 3,执行一次递增 3
decrby k1 3 执行这个命令会把 k1 的值递减 3,执行一次递减 3
getrange k1 0 3 范围内取值,假设我现在 k1 的值为 14abc,执行命令后的结果就是 14ab
setrange k1 1 mm 范围内设值,假设我现在 k1 的值为 14abc,执行命令后的结果就是 1mmbc
setex k4 10 v4 设置 k4 的值为 v4并且过期时间为 10 秒
mset k1 v1 k2 v2 同时设置多个key 和 value ,体现到 java 代码中就是你直接把 map 的key-value往redis 塞就可以了
mget k1 k2 同时获取多个 value 值
5、redis 列表(List)
lpush list01 1 2 3 4 5 设置 key 为 list01 value 为一个集合,值为 1 2 3 4 5
lrange list01 0 -1 返回 list01 中所有的值,结果为 5 4 3 2 1
rpush list02 1 2 3 4 5 设置 key 为 list01 value 为一个集合,值为 1 2 3 4 5
lrange list02 0 -1 返回 list02 中所有的值,结果为 1 2 3 4 5
lpush 和 rpush 区别:
lpush 设置一个集合,使用 lrange 返回集合中的元素是逆序输出的
rpush 设置一个集合,使用 lrange 返回集合中的元素是顺序输出,怎么设置怎么出来
现在假设我已经执行了两条命令:
lpush list01 1 2 3 4 5
rpush list02 1 2 3 4 5
其次 pop 是出栈的命令,lpop 表示从左边出栈,rpop 表示从右边出栈(一次只出栈一个)
lpop list01 结果是 5 出去了(因为你 lrange list01 0 -1 结果 5 是在栈顶所以先出去的是 5)
lpop list02 结果是 1 出去了(因为你 lrange list02 0 -1 结果 1 是在栈顶所以先出去的是 1)
rpop list01 结果是 1 出去了(从右边出栈,所以栈底的先出去)
rpop list02 结果是 5 出去了(从右边出栈,所以栈底的先出去)
lindex list01 3 按照索引下标获得元素(这个就是获取 key 为 list01 的 value 值中下标为 3 的元素)
llen list01 返回 list01 中元素的个数
假设我现在先执行了命令:
rpush list01 1 2 3 3 4 4 4 4 5 5
lrem list01 3 4 删除 key 为 list01 的 value 值,具体是删除 3 个 4
假设我先执行了命令:
lpush list01 1 2 3 4 5 6
ltrim list01 1 3 截取指定范围的 key 再赋值给 key(这里就是截取 list01 的 value 值,从下标 1 开始截取,到下标 3 结束,然后再把截取的结果赋值给 list01)所以结果为 5 4 3
假设我先执行了命令:
lpush list01 1 2 3 4
lpush list02 5 6 7 8
lrange list01 0 -1 结果就是 4 3 2 1
lrange list02 0 -1 结果就是 8 7 6 5
其次要知道 pop 是出栈,push 是进栈
RPOPLPUSH lis01 list02 意思就是 list01 从右边出栈一个,进栈到 list02 中
lrange list02 0 -1 结果就是 1 8 7 6 5
『lset key index value命令』:
假设执行命令:
lrange list01 0 -1 结果是 4 3 2 1
lset list01 2 x 这个就是把下边为 2 的 value 值设置为了 x
lrange list01 0 -1 结果是 4 3 x 1
『linsert key before/after value1 value2 命令』:
假设执行命令:
lrange list01 0 -1 结果是 4 3 2 1
linsert list01 before 3 linux 意思就是往 key 为 list01 的集合中插入值,在 value 值为 3 之前插入一个值是 linux
lrange list01 0 -1 结果是 4 linux 3 2 1
linsert list01 after 2 windows 意思就是往 key 为 list01 的集合中插入值,在 value 值为 2 之后插入一个值是 windows
lrange list01 0 -1 结果是 4 linux 3 2 windows 1
关于 List 总结:
1、它是一个字符串链表,left 和 right 都可以插入、添加
2、如果键不存在,创建新的链表
3、如果键已存在,新增内容
4、如果值全移除,对应的键也就消失了
5、链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了
6、redis 集合(Set)
sadd set01 1 1 2 2 3 3 往 set 集合里面插入数据,key 是 set01 ,因为 set 里面不允许重复所以你插入重复的数据,会被覆盖掉。所以 value 就是 1 2 3 三个值
smembers set01 返回 key 为 set01 集合的 value 值(结果是 1 2 3)
sismember set01 2 返回 key 为 set01 的集合中是否包含元素 2,包含返回 1 ,不包含返回 0
scard set01 获取集合中元素的个数
--------------------------------------------------------
『srem key value』 命令 删除集合中的元素
srem set01 2 这个就是把 set01 集合中的元素 2 给删除
smembers set01 结果就是 1 和 3 ,元素 2 已经被删除了
----------------------------------------------------------
『srandmember key 整数』命令 随机返回几个整数
sadd list02 1 2 3 4 5 6
srandmember list02 3 这样就会从集合 list02 中随机返回 3 个整数
----------------------------------------------------------------
『spop key』 命令 随机出栈集合中的元素
spop set02 会把 set02 中的元素随机出栈一个
-----------------------------------------------------------------
『smove key1 key2 key1里面的某个元素』命令 把 key1 中某个元素移动到 key2 中
sadd set01 1 2 3 4 5
sadd set02 x y z
smove set01 set02 3 这样就把 set01 中的元素 3 移动到了 set02 中
smembers set02 结果就是 y 3 x z
-------------------------------------------------------------------
『sdiff key1 key2』命令 两个集合取差集,结果是返回第一个集合中有的元素,而第二个集合中没有的元素
sadd set01 1 2 3 4 5
sadd set01 1 2 3 a b
sdiff set01 set02 结果就是 4 5
『sinter key1 key2』命令 两个集合取交集
sinter set01 set02 结果是 1 2 3
『sunion key1 key2』命令 两个集合取并集
sunion set01 set02 结果是 1 2 3 4 5 a b
7、redis 哈希(Hash)
关于哈希可以概括为:KV 模式不变,但 V 是一个键值对
hset user id 1 这里的 key 是 user 但是 value 又是一个键值对(key 为 id,value 是 1)
hset user name xy
hget user id 返回 1
hget user name 返回 xy
------------------------------------
hmset customer id 1 name zs age 18 可以一次性设置多个 key 和 value
hmget customer id name age 结果就是 1 zs 18
hgetall customer 一次性获取所有,返回 id 1 name zs age 18
-------------------------------------------------------------
hdel customer name 把 name 这个 key 给删除
hgetall customer 返回 id 1 age 18
-----------------------------------------------------------
hlen customer 查询 key 是 customer 这个哈希的 value 值中 key 的个数(结果是 2)
---------------------------------------------------------------
hexists customer id 判断 key 是 customer 这个哈希的 value 值中是否存在 key 是 id 的,返回 1 表示存在,0 表示不存在
--------------------------------------------------------------
hkeys customer 查看 key 是 customer 这个哈希的 value 值中所有的 key (结果是 id age)
hvals customer 查看 key 是 customer 这个哈希的 value 值中所有的 value (结果是 1 18)
----------------------------------------------------------------------------------
hincrby customer age 2 key 是 customer 这个哈希的 value 值中 key 为 age 的 value 值递增 2
hset customer score 2.5
hincrbyfloat customer score 0.5 key 是 customer 这个哈希的 value 值中 key 为 age 的 value 值递增 0.5 (结果就是 3)
8、redis 有序集合 Zset(sorted set)
Zset 其实就是在 set 基础上加了一个 score 值。之前 set 是 k1 v1 v2 v3 ,那么现在 zset 是 k1 score1 v1 score2 v2,相当于它的 value 值又是一个 k-v 键值对
zadd zset01 60 v1 70 v2 80 v3 90 v4 100 v5 向 zset 中插入数据,key 是 zset01 value 值又是一个 k-v 键值对,其中 key 是 score 值
zrange zset01 0 -1 显示 zset 中的元素(结果为 v1 v2 v3 v4 v5)
zrange zset01 0 -1 withscores 显示 zset 中的元素,连同 score 一起显示出来(结果为v1 70 v2 80 v3 90 v4 100 v5)
------------------------------------------------------------------------
『zrangebyscore key 开始score 结束score』命令
zrangebyscore zset01 60 80 返回 score 值在 60 到 80 之间的(结果就是 v1 v2 v3)
zrangebyscore zset01 (60 (80 "(" 表示不包含(结果是 v2)
zrangebyscore zset01 60 90 limit 2 2 在返回结果上进行筛选,从下标为 2 的元素开始取,取 2 个(结果是 v3 v4)
-------------------------------------------------------
zrem zset01 v5 删除元素
--------------------------------------------
zcard zset01 返回元素个数,返回 4(因为上面删除了一个)
---------------------------------------------------
zcount zset01 60 80 统计 key 为 zset01 score 值在 60-80之间的个数(结果返回 3)
https://weixin.qq.com/f/EKnr2hIaaUIKpaKMEwpeMjk (二维码自动识别)