基本数据类型:List列表
在redis里面,我们可以把list玩成,栈、队列、阻塞队列!
redis所有的list命令都是用l开头的
list是可以存放重复值的
127.0.0.1:6379> clear
127.0.0.1:6379> lpush list1 one # 往名为list1的list中里放入值
(integer) 1
127.0.0.1:6379> lpush list1 two
(integer) 2
127.0.0.1:6379> lpush list1 three # 按123放入
(integer) 3
127.0.0.1:6379> lrange list1 0 -1 # 取出list1的值
1) "three"
2) "two"
3) "one" # 发现是倒着出来的,先进后出
127.0.0.1:6379> lrange list1 0 1 # 通过区间取出具体的值
1) "three"
2) "two"
127.0.0.1:6379> rpush list1 right # 从右边插入一个值right
(integer) 4
127.0.0.1:6379> lrange list1 0 -1 # 取出list1的值
1) "three"
2) "two"
3) "one"
4) "right" # 发现right这个值最后出来,说明右边是指列表的尾部
#############################################################
移除命令
lpop:往左边移除
rpop:往右边移除
127.0.0.1:6379> lrange list1 0 -1 # 获取list1中的所有值
1) "three"
2) "two"
3) "one"
4) "right"
127.0.0.1:6379> lpop list1 # 从左边(头)移除一个
"three" # 移除的元素
127.0.0.1:6379> rpop list1 # 从右边(尾)移除一个
"right" # 移除的元素
127.0.0.1:6379> lrange list1 0 -1 # 移除后的list1
1) "two"
2) "one"
#############################################################
lrem:l remove移除指定的值!
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem list 1 three # 移除一个three
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lpush list three # 再放进去一个three
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem list 2 three # 移除两个three
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
#############################################################
Lindex:根据索引获取值
127.0.0.1:6379> lindex list1 1 # 获取list1中的索引为1的值
"one"
127.0.0.1:6379> lindex list1 0
"two"
#############################################################
llen:获取list长度
127.0.0.1:6379> lpush list one
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> llen list # 返回list的长度(此处list是key名)
(integer) 3
#############################################################
trim:修剪;截断list,相当于截取list中的值
127.0.0.1:6379> lpush mylist hello
(integer) 1
127.0.0.1:6379> lpush mylist hello1
(integer) 2
127.0.0.1:6379> lpush mylist hello2
(integer) 3
127.0.0.1:6379> lpush mylist hello3 # 往里面放四个值
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1 # 获得值
1) "hello3"
2) "hello2"
3) "hello1"
4) "hello"
# 截取0-1的值,当然你想截取其他的也可以,截取了,list也被修改了
127.0.0.1:6379> ltrim mylist 0 1
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hello3"
2) "hello2"
#############################################################
rpoplpush # 移除列表最后一个元素,放到另一个list中
127.0.0.1:6379> lrange mylist 0 -1
1) "hello3"
2) "hello2"
3) "hello1"
127.0.0.1:6379> rpoplpush mylist otherlist # 移动最后一个元素到其他list
"hello1"
127.0.0.1:6379> lrange mylist 0 -1 # 可以看到已经被移走了
1) "hello3"
2) "hello2"
127.0.0.1:6379> lrange otherlist 0 -1 # 移动到这个新的list中了
1) "hello1"
#############################################################
lset:将列表指定下标的值,替换为另一个值,就是更新操作
127.0.0.1:6379> exists list # 判断这个列表是否存在
(integer) 0
127.0.0.1:6379> lset list 0 item # 错误的原因是list不存在
(error) ERR no such key
127.0.0.1:6379> lpush list value1 # 先放入一个value1
(integer) 1
127.0.0.1:6379> lrange list 0 0
1) "value1"
127.0.0.1:6379> lset list 0 value2 # 把第0索引替换成一个value2
OK
127.0.0.1:6379> lrange list 0 0
1) "value2"
127.0.0.1:6379> lset list 1 value3 # list中没有索引为1的值,所以失败
(error) ERR index out of range
#############################################################
linsert:插入,在list的某个值前,或后插入一个值
127.0.0.1:6379> flushdb # 清空redis数据库
OK
127.0.0.1:6379> rpush mylist hello
(integer) 1
127.0.0.1:6379> rpush mylist world # 放两个值
(integer) 2
# 在world前插入一个other
127.0.0.1:6379> linsert mylist before "world" "other"
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
# 在world前插入一个!!!!!
127.0.0.1:6379> linsert mylist after world "!!!!!"
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
4) "!!!!!"
小结
1、他实际上是一个链表,before Node after , left , right都可以插入值
2、如果key不存在,创建新的链表
3、如果key存在,新增内容
4、如果移除了所有值,空链表,也代表不存在!
5、在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点~
消息排队!消息队列( Lpush Rpop ) ,栈( Lpush Lpop )
set集合
和java中一样,Redis中的set也不允许值的重复!
##############################################################################
127.0.0.1:6379> sadd myset abc # 往一个“myset”的set里放一个成员abc,添加元素
(integer) 1
127.0.0.1:6379> sadd myset hello
(integer) 1
127.0.0.1:6379> sadd myset UNO
(integer) 1
127.0.0.1:6379> smembers myset # 查看指定set的所有值
1) "hello"
2) "UNO"
3) "abc"
127.0.0.1:6379> sismember myset abc # 判断某个值在不在set中,在返回1,不在返回0
(integer) 1
127.0.0.1:6379> sismember myset world
(integer) 0
##############################################################################
# 获取元素个数
127.0.0.1:6379> scard myset # 获取set集合中的元素个数
(integer) 3
##############################################################################
# 移除元素srem #remove移除
127.0.0.1:6379> sadd myset UNO2
(integer) 1
127.0.0.1:6379> scard myset
(integer) 4
127.0.0.1:6379> srem myset hello # 移除元素hello
(integer) 1
127.0.0.1:6379> scard myset
(integer) 3
127.0.0.1:6379> smembers myset
1) "UNO"
2) "UNO2"
3) "abc"
##############################################################################
# srandmember #set:无需不重复集合,抽随机
127.0.0.1:6379> srandmember myset #随机从里面抽取1个出来
"UNO"
127.0.0.1:6379> srandmember myset
"UNO"
127.0.0.1:6379> srandmember myset
"UNO2"
127.0.0.1:6379> srandmember myset
"abc"
127.0.0.1:6379> srandmember myset 2 #随机从里面抽取2个出来
1) "abc"
2) "UNO2"
##############################################################################
# spop :随机删除一个set中的一个元素
127.0.0.1:6379> clear
127.0.0.1:6379> SMEMBERS myset # 展示所有成员
1) "UNO"
2) "UNO2"
3) "abc"
127.0.0.1:6379> spop myset # 随机删除一个元素
"UNO"
127.0.0.1:6379> spop myset
"abc"
127.0.0.1:6379> smembers myset
1) "UNO2"
##############################################################################
# 将一个指定的值,移动到另一个set集合里
127.0.0.1:6379> SMEMBERS myset #展示
1) "UNO2"
127.0.0.1:6379> sadd myset ggg # 添加元素
(integer) 1
127.0.0.1:6379> sadd myset ddd
(integer) 1
127.0.0.1:6379> sadd myset2 set2
(integer) 1
127.0.0.1:6379> smove myset myset2 ddd # 移动元素 原set 目标set 元素
(integer) 1
127.0.0.1:6379> smembers myset2 #查看目标set中是否有:是否移动成功了
1) "ddd"
2) "set2"
127.0.0.1:6379> smembers myset
1) "ggg"
2) "UNO2"
##############################################################################
# 微博,B站,共同关注!(交集)
数字集合类:
- 差集 sdiff
- 交集 sinter
- 并集 sunion
127.0.0.1:6379> sadd key1 a
(integer) 1
127.0.0.1:6379> sadd key1 b
(integer) 1
127.0.0.1:6379> sadd key1 c # set集合key1中放了a、b、c
(integer) 1
127.0.0.1:6379> sadd key2 c
(integer) 1
127.0.0.1:6379> sadd key2 d
(integer) 1
127.0.0.1:6379> sadd key2 e # set集合key2中放了c、d、e
(integer) 1
127.0.0.1:6379> sdiff key1 key2 # 求以前一个set为参照物,1和2的差集,就是说1中有,2没有的
1) "a"
2) "b"
127.0.0.1:6379> sinter key1 key2 # 求key1 和key 2都有的交集,共同好友功能就可以这样实现
1) "c"
127.0.0.1:6379> sunion key1 key2 # 并集,key1和key2加起来的所有,并去重
1) "c"
2) "b"
3) "a"
4) "e"
5) "d"
微博,A用户将所有关注的人放在一个set集合中!将它的粉丝也放在一个集合中!
B用户也将所有关注的人放在一个set集合中!将它的粉丝也放在一个集合中!
这样取交集,就可以实现共同关注,和共同粉丝了
像:共同关注,共同爱好,二度好友,推荐好友!(六度分割理论)这些都可以使用redis的set来实现