3、Redis-数据类型详解(string,list,set,sort set,hash)
Redis数据类型-string
string为最简单的类型,与Memcached一样的类型,一个key对应一个value,其支持的操作与Memcached的操作类似,它的功能更丰富。设置可以存二进制的对象。
创建格式:set key value
127.0.0.1:6379> set mykey "test"OK
获取:get key
127.0.0.1:6379> get mykey"test"
创建多个键值对:mset key1 value key2 value
127.0.0.1:6379> mset key1 1 key2 2 key3 3OK
获取多个键值对:mget key1 key2 key3
127.0.0.1:6379> mget key1 key2 key31) "1"2) "2"3) "3"
ps:支持Tab补全命令
Redis数据类型-list
list是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字。push、pop是一对反义词,压进去挤出来
使用 list 结构,我们可以轻松地实现最新消息排行等功能(比如新浪微博的 TimeLine )。list 的另一个应用就是消息队列,可以利用 list 的 push操作,将任务存在 list 中,然后工作线程再用pop操作将任务取出进行执行。
存入key值方法
格式:LPUSH key value
127.0.0.1:6379> LPUSH list1 "aminglinux"(integer) 1127.0.0.1:6379> LPUSH list1 "aminglinux"(integer) 2127.0.0.1:6379> LPUSH list1 "1 2 3"(integer) 3127.0.0.1:6379> LPUSH list1 "aaa bbb"(integer) 4
查看key值
格式:LRANGE key名 开始 结束(-1是末尾)
127.0.0.1:6379> LRANGE list1 0 -11) "aaa bbb"2) "1 2 3"3) "aminglinux"4) "aminglinux"
取出key值
格式:LPOP key名
127.0.0.1:6379> LPOP list1"aaa bbb"
取完你在看就没有这个值了,LRANGE list1 0 -1
127.0.0.1:6379> LRANGE list1 0 -11) "1 2 3"2) "aminglinux"3) "aminglinux"
Redis数据类型-set
set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字。比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。因为 Redis 非常人性化的为集合提供了求交集、并集、差集等操作,那么就可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。
set示例
创建命令SADD
格式:SADD 元素名 值
127.0.0.1:6379> SADD set1 a(integer) 1127.0.0.1:6379> SADD set1 b(integer) 1127.0.0.1:6379> SADD set1 c(integer) 1
查看元素值
127.0.0.1:6379> SMEMBERS set11) "c"2) "a"3) "b"
交集、并集、差集
set1、set2的值:
127.0.0.1:6379> SMEMBERS set11) "c"2) "a"3) "b"127.0.0.1:6379> SMEMBERS set21) "a"2) "b"3) "2"
求交集:SINTER 元素1 元素2
127.0.0.1:6379> SINTER set1 set21) "a"2) "b"
求并集:SUNION
127.0.0.1:6379> SUNION set1 set21) "a"2) "c"3) "b"4) "2"
求差集:SDIFF
127.0.0.1:6379> SDIFF set1 set2 1) "c"
删除元素值:SREM
例如删除元素set1里的c值
127.0.0.1:6379> SREM set1 c(integer) 1127.0.0.1:6379> SMEMBERS set11) "a"2) "b"
Redis数据类型-sort set
sorted set是有序集合,它比set多了一个权重参数score,使得集合中的元素能够按 score 进行有序排列,比如一个存储全班同学成绩的 Sorted Sets,其集合 value 可以是同学的学号,而 score 就可以是其考试得分,这样在数据插入集合的时候,就已经进行了天然的排序。
格式:ZADD key名 score权重 value值
127.0.0.1:6379> ZADD set3 12 abc127.0.0.1:6379> ZADD set3 2 "cde 123"127.0.0.1:6379> ZADD set3 24 "123-aaa"127.0.0.1:6379> ZADD set3 4 "a123a"
正序查看(从小到大)
127.0.0.1:6379> ZRANGE set3 0 -11) "cde 123"2) "a123a"3) "abc"4) "123-aaa"
倒序 (从大到小)
127.0.0.1:6379> ZREVRANGE set3 0 -11) "123-aaa"2) "abc"3) "a123a"4) "cde 123"
Redis数据类型-hash
在Memcached中,我们经常将一些结构化的信息打包成hashmap,在客户端序列化后存储为一个字符串的值(一般是 JSON 格式),比如用户的昵称、年龄、性别、积分等。
示例
127.0.0.1:6379> hset hash1 name aming
127.0.0.1:6379> hget hash1 name
"aming"
127.0.0.1:6379> hset hash1 age 30
127.0.0.1:6379> hget hash1 age
"30"
查看所有
127.0.0.1:6379> hgetall hash1
1) "name"奇数行是key
2) "aming"偶数行是value
3) "age"
4) "30"
Redis常用操作详解 (string, list)
string
set key1 aminglinux
get key1
命令:setnx
检测key值是否存在,返回0表示存在并且不会覆盖原来的key值,返回1表示不存在并且创建key值
用法:setnx key名 key值
举例:
存在
127.0.0.1:6379> get key1"a"127.0.0.1:6379> setnx key1 a(integer) 0
不存在
127.0.0.1:6379> setnx key3 a(integer) 1127.0.0.1:6379>
命令:setex
设置过期时间
格式:setex key名 过期时间 key值
set设置方法:set key名 key值 ex 过期时间
127.0.0.1:6379> get key3 ##先查看是有的"a"127.0.0.1:6379> set key3 bb ex 10 在覆盖一个过期时间为10秒的OK127.0.0.1:6379> get key3"bb"127.0.0.1:6379> get key3 ##10秒之后再看就没了(nil)
setex设置过期时间方法:
setex key3 10 1 //给key3设置过期时间为10s,值为1,若key已经存在,会覆盖新的值
127.0.0.1:6379> get key3"2"127.0.0.1:6379> setex key3 10 1OK127.0.0.1:6379> get key3"1"127.0.0.1:6379> get key3(nil)
list
连续创建多个key值
mset k1 1 k2 a k3 c
mget k1 k3 k2
命令:lpush(存,从最上面插入)
先存入的key值会在下边
127.0.0.1:6379> lpush list2 aaa(integer) 1127.0.0.1:6379> lpush list2 bbb(integer) 2127.0.0.1:6379> lpush list2 ccc(integer) 3127.0.0.1:6379> LRANGE list2 0 -11) "ccc"2) "bbb"3) "aaa"
命令:lpop(取,从上往下取)
它会先取最上边的,也就是最后存入的
127.0.0.1:6379> LRANGE list2 0 -11) "ccc"2) "bbb"3) "aaa"127.0.0.1:6379> LPOP list2"ccc"
命令:rpush(存,从最下边存入)
127.0.0.1:6379> LRANGE list2 0 -11) "bbb"2) "aaa"127.0.0.1:6379> rpush list2 111(integer) 3127.0.0.1:6379> LRANGE list2 0 -11) "bbb"2) "aaa"3) "111"
命令:rpop(取,从下往上取)
127.0.0.1:6379> LRANGE list2 0 -11) "bbb"2) "aaa"3) "111"127.0.0.1:6379> rpop list2"111"
命令:linsert(插入)
LINSERT key BEFORE|AFTER pivot value
格式:linsert key值 前|后 原始值 要插入的值
linsert list1 before aaa ccc //在aaa的前面插入一个元素为ccc
127.0.0.1:6379> LRANGE list2 0 -11) "bbb"2) "aaa"127.0.0.1:6379> LINSERT list2 BEFORE aaa ccc(integer) 3127.0.0.1:6379> LRANGE list2 0 -11) "bbb"2) "ccc"3) "aaa"
在aaa后边插入ddd
127.0.0.1:6379> LINSERT list2 AFTER aaa ddd(integer) 4127.0.0.1:6379> LRANGE list2 0 -11) "bbb"2) "ccc"3) "aaa"4) "ddd"
命令:lset(更改某个key值)
lset list2 2 AAA //把第2个元素修改为AAA
127.0.0.1:6379> LRANGE list2 0 -11) "bbb"2) "ccc"3) "aaa"4) "ddd"127.0.0.1:6379> LSET list2 2 AAAOK127.0.0.1:6379> LRANGE list2 0 -11) "bbb"2) "ccc"3) "AAA"4) "ddd"
命令:lindex(查看某一个元素)
lindex list2 1 //查看第1元素
127.0.0.1:6379> LINDEX list2 1"ccc"
命令:llen(查看key里所有的值)
llen lista //查看链表中有几个元素
127.0.0.1:6379> LLEN list2(integer) 4
集合(set)
命令:sadd(插入)
sadd seta aaa //向集合seta中放入元素
127.0.0.1:6379> sadd seta aaa(integer) 1127.0.0.1:6379> smembers seta1) "aaa"
命令:smembers(查看)
smembers seta //查看集合中的所有元素
127.0.0.1:6379> smembers seta1) "bbb"2) "aaa"
命令:srem(删除)
srem seta aaa //删除元素
127.0.0.1:6379> srem seta aaa(integer) 1127.0.0.1:6379> smembers seta1) "bbb"2) "ccc"
spop seta //随机取出一个元素,删除
127.0.0.1:6379> spop seta"bbb"127.0.0.1:6379> smembers seta1) "ccc"
sdiff seta setb //求差集,以seta为标准(哪个写在前边就以哪个为标准)
sdiffstore setc seta setb //求差集并且存储到新的集合里,存储到了setc里
sinter seta setb //求交集
sinterstore setd seta setb //将交集存储setd
sunion seta setb //求并集
sunionstore sete seta setb //求并集并存储到sete
sismember seta aaa //判断一个元素是否属于一个集合(有的话显示0,没有显示1)
srandmember seta //随机取出一个元素,但不删除
srandmember seta 2//随机取出多个元素,但不删除(集合后边加数字就行)
有序集合(zadd)
命令:zadd
格式:zadd 集合名 等级 元素值
zadd zseta 11 123 //创建有序集合,根据等级从小到大排序
zrange zseta 0 -1 //显示所有元素,按顺序显示
zrange zseta 0 -1 withscores //可以带上分值
zrem zseta 123 //删除指定元素
zrank zseta aaa //返回元素的索引值,索引值从0开始,按score正向排序(索引值就是下标)
zrevrank zseta 222 //同上,不同的是,按score反序排序
zrevrange zseta 0 -1 反序显示所有元素,并带分值
zcard zseta //返回集合中所有元素的个数
zcount zseta 1 10 // 返回分值范围1-10的元素个数
zrangebyscore zseta 1 10 // 返回分值范围1-10的元素
zremrangebyrank zseta 0 2 //删除索引范围0-2的元素,按score正向排序
zremrangebyscore zseta 1 10 //删除分值范围1-10的元素
hash
格式:hset key field value
hset hash1 name xjw //建立hash
127.0.0.1:6379> hset hash1 name xjw(integer) 1127.0.0.1:6379> hget hash1 name"xjw"
hget hash1 name
127.0.0.1:6379> hget hash1 name"xjw"
HGETALL hash1 //查看所有的键值
127.0.0.1:6379> HGETALL hash11) "name"2) "xjw"
hmset hash2 1 a 2 b 3 c 4 d //批量建立键值对
127.0.0.1:6379> hmset hash2 1 a 2 b 3 c 4 dOK127.0.0.1:6379> HGETALL hash21) "1"2) "a"3) "2"4) "b"5) "3"6) "c"7) "4"8) "d"
hmget hash2 1 2 // 获取某一个的值
127.0.0.1:6379> hmget hash2 11) "a"127.0.0.1:6379> hmget hash2 1 21) "a"2) "b"
hdel hash2 xingbie //删除指定filed
127.0.0.1:6379> hdel hash2 1(integer) 1127.0.0.1:6379> HGETALL hash2 ##在查看就没有a键值了1) "2"2) "b"3) "3"4) "c"5) "4"6) "d"
hkeys hash1 //打印所有的key
127.0.0.1:6379> hkeys hash11) "name"127.0.0.1:6379> hkeys hash21) "2"2) "3"3) "4"
hvals hash1 //打印所有的values
127.0.0.1:6379> hvals hash11) "xjw"127.0.0.1:6379> hvals hash21) "b"2) "c"3) "d"
hlen hash1 //查看hash有几个filed
127.0.0.1:6379> hlen hash1(integer) 1127.0.0.1:6379> hlen hash2(integer) 3