Redis数据结构简介
redis是一种高级的key:value存储系统,其中value支持五种数据类型:
1.字符串(strings)
2.字符串列表(lists)
3.字符串集合(sets)
4.有序字符串集合(sorted sets)
5.哈希(hashes)
而关于key,有几个点要提醒大家:
1.key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率;
2.key也不要太短,太短的话,key的可读性会降低;
3.在一个项目中,key最好使用统一的命名模式,例如user:10000:passwd。
Redis数据结构-strings
[root@mysql1 src]# ./redis-cli
127.0.0.1:6379> set mystr "abcd"
OK
127.0.0.1:6379> get mystr
"abcd"
字符串类型的用法就是这么简单,因为是二进制安全的,所以你完全可以把一个图片文件的内容作为字符串来存储。
还可以通过字符串类型进行数值操作,在遇到数值操作时,redis会将字符串类型转换成数值。
127.0.0.1:6379> set mynum "2"
OK
127.0.0.1:6379> get mynum
"2"
127.0.0.1:6379> incr mynum
(integer) 3
127.0.0.1:6379> get mynum
"3"
127.0.0.1:6379> set mynum2 "2.5"
OK
127.0.0.1:6379> get mynum2
"2.5"
127.0.0.1:6379> incr mynum2
(error) ERR value is not an integer or out of range
set key value
mset key value [key value...]
get key
mget key [key...]
计数:
incr key
Redis数据结构-lists
redis中的lists在底层实现上并不是数组,而是链表。lists的常用操作包括LPUSH、RPUSH、LRANGE等。我们可以用LPUSH在lists的左侧插入一个新元素,用RPUSH在lists的右侧插入一个新元素,用LRANGE命令从lists中指定一个范围来提取元素。
127.0.0.1:6379> lpush mylist "1" //新建一个list叫做mylist,并在列表头部插入元素”1”
(integer) 1
127.0.0.1:6379> rpush mylist "2" //在mylist右侧插入元素”2”
(integer) 2
127.0.0.1:6379> lpush mylist "3" //在mylist左侧插入元素”3”
(integer) 3
127.0.0.1:6379> rpush mylist "4" //在mylist右侧插入元素”4”
(integer) 4
127.0.0.1:6379> lpush mylist "5"
(integer) 5
127.0.0.1:6379> rpush mylist "6"
(integer) 6
127.0.0.1:6379> lpush mylist "7"
(integer) 7
127.0.0.1:6379> rpush mylist "8"
(integer) 8
127.0.0.1:6379> lrange mylist 0 3 //列出mylist中从编号0到编号3的元素
1) "7"
2) "5"
3) "3"
4) "1"
127.0.0.1:6379> lrange mylist 4 7 //列出mylist中从编号4到编号7的元素
1) "2"
2) "4"
3) "6"
4) "8"
lists的应用相当广泛,随便举几个例子:
1.我们可以利用lists来实现一个消息队列,而且可以确保先后顺序,不必像MySQL那样还需要通过ORDER BY来进行排序。
2.利用LRANGE还可以很方便的实现分页的功能。
rpush key value [value ...]
lpush key value [value ...]
linsert key before|after pivot value
lrange listkey 0 -1
lindex key index
llen key
lpop key
rpop key
Redis数据结构-集合
redis的集合,是一种无序的集合,集合中的元素没有先后顺序。
127.0.0.1:6379> sadd myset "one" //向集合myset中加入一个新元素"one"
(integer) 1
127.0.0.1:6379> sadd myset "two"
(integer) 1
127.0.0.1:6379> smembers myset //列出集合myset中的所有元素
1) "two"
2) "one"
127.0.0.1:6379> sismember myset "one" //判断元素1是否在集合myset中1表示存在
(integer) 1
127.0.0.1:6379> sismember myset "three" //判断元素3是否在集合myset中0表示不存在
(integer) 0
127.0.0.1:6379> sadd yourset "1" //新建一个新的集合yourset
(integer) 1
127.0.0.1:6379> sadd yourset "2"
(integer) 1
127.0.0.1:6379> sadd yourset "2" //集合不能添加重复数据
(integer) 0
127.0.0.1:6379> smembers yourset
1) "1"
2) "2"
127.0.0.1:6379> sunion myset yourset //对两个集合求并集
1) "1"
2) "two"
3) "2"
4) "one"
sadd key element [element ...]
srem key element [element ...]
scard key 计算元素个数
spop key
smembers key
Redis数据结构-有序集合
redis不但提供了无序集合(sets),还很体贴的提供了有序集合(sorted sets)。有序集合中的每个元素都关联一个序号(score),这便是排序的依据。很多时候,我们都将redis中的有序集合叫做zsets。有序集合相关的操作指令都是以z开头的,比如zrange、zadd、zrevrange、zrangebyscore等等
127.0.0.1:6379> zadd myzset 1 baidu.com
(integer) 1
127.0.0.1:6379> zadd myzset 3 360.com
(integer) 1
127.0.0.1:6379> zadd myzset 2 google.com
(integer) 1
127.0.0.1:6379> zrange myzset 0 -1 withscores
1) "baidu.com"
2) "1"
3) "google.com"
4) "2"
5) "360.com"
6) "3"
127.0.0.1:6379> zrange myzset 0 -1
1) "baidu.com"
2) "google.com"
3) "360.com"
zadd key score member [score member ...]
zcard key
zrem key member [member...]
Redis数据结构-哈希
hashes存的是字符串和字符串值之间的映射,比如一个用户要存储其全名、姓氏、年龄等等,就很适合使用哈希。
//建立哈希,并赋值
127.0.0.1:6379> hmset user:001 username allen passwd hgc123456 age 32
OK
//列出哈希的内容
127.0.0.1:6379> hgetall user:001
1) "username"
2) "allen"
3) "passwd"
4) "hgc123456"
5) "age"
6) "32"
//更改哈希中的某一个值
127.0.0.1:6379> hset user:001 passwd 123456
(integer) 0
//再次列出哈希的内容
127.0.0.1:6379> hgetall user:001
1) "username"
2) "allen"
3) "passwd"
4) "123456"
5) "age"
6) "32"
hset key field value
hget key field
hdel key field
hlen key
hmset key field value [field value ...]
hmget key field [field ...]
hkeys key 获取所有field
hvals key 获取所有value
数据结构 内部编码
string raw,int,embstr
hash hashtable,ziplist
list linkedlist,ziplist
set hashtable,intset
zset skiplist,ziplist