redis(Remote dictionary server):是一个基于键值对(key-value)的NoSQL
redis的数据是存储在内存当中,可用于高速缓存,消息队列。
redis主要的数据类型有5种:
字符串(string),哈希(hash),列表(list),集合(set),有序集合(zset)
redis的优点:
1.速度快,读的速度大约110000/s,写的速度大约85000/s
2.数据类型多样,可以实现的功能多
3.简单稳定,代码量少,单线程工作
4.支持的语言多,perl,python,Java,lua等
5.持久化
6.主从复制
7.高可用和分布式
redis的缺点:由于数据存储在内存当中,大规模的数据存放在redis中,内存成本太高
EX:设置键值对是添加键过期,单位是秒
PX:设置键值对是添加键过期,单位是微秒
NX:表示这个键是新的,是之前不存在的(用于创建键值对)
XX:表示这个键是存在的(用于修改键值对的值)
redis全局命令:
keys * 查询所有的键
dbsize 统计键的数量总和
exists 查看这个key是否存在
del key 删除键值对
redis的数据结构类型:在redis中,所有的key都是字符串类型的数据
1.字符串 string
指的是值得数据类型是字符串,包含简单的字符串和复杂的字符串,以及数字、图片、声音、视频等这些二进制;特点:一个key对应一个value。
单个值大小不超过512M
字符串的内部编码:redis根据key对应的value的长短,类型来判断使用哪种内部编码;
int:8字节长度的整数
embstr:小于等于39个字节的字符串
raw:大于39个字节的字符串
object encoding key:查看key对应的内部编码
命令格式:
1.设置字符串:set key value [ex seconds] [px milliseconds] [nx|xx]
2.获取键的值:get key
3.查询键是否存在:exists key
4.批量设置键值对:mset key value key value……
5.批量获取值:mget key1……
6.计数:
(1)incr key:对整数数字有效,给key的值增加1,如果这个键不存在,这个命令会设置这个
键,并且默认值是从0开始增加1
(2)decr key:自减1,同上
(3)incrby key 数字:给key加上数字
(4)decrby key 数字:给key减去数字
(5)incrbyfloat key 小数:给key加上一个小数
7.append key value:给key的值后面再加上一个字符串
8.strlen key:显示key对应的value字符串长度
9.getset key value:更新key的值并返回原值
10.setrange key 数字下标 新值:更新value某个位置的字符,如果我们要设置的数字下标超出
value的长度,仍然会把新的字符串添加到下标指定的位置,中间填充
11.getrange key start end:获取部分value
2.哈希 hash
key -(field1,value1 field2,value2...) key 对应的不是一个value而是一组或几组(field value)
命令格式:
1、hset key field value
2、hget key field 获取field值
127.0.0.1:6379> hset hash1 name ll
(integer) 1
127.0.0.1:6379> hget hash1 name
"ll"
3、hdel key field1 field2 删除field
127.0.0.1:6379> hdel hash1 name
(integer) 1
4、hlen ksy 统计field的个数
127.0.0.1:6379> hlen hash1
(integer) 0
5、hmset key field1 value1 field2 value2…
hmget key field1 field2…
127.0.0.1:6379> hmset hash name 'tom' age 20 class 4
OK
127.0.0.1:6379> hget hash name
"tom"
127.0.0.1:6379> hmget hash name age class
1) "tom"
2) "20"
3) "4"
6、hkeys key 获取所有的field
127.0.0.1:6379> hkeys hash
1) "name"
2) "age"
3) "class"
7、hvals key获取所有field的值
127.0.0.1:6379> hvals hash
1) "tom"
2) "20"
3) "4"
8、hgetall key 获取所有的field和value
127.0.0.1:6379> hgetall hash
1) "name"
2) "tom"
3) "age"
4) "20"
5) "class"
6) "4"
9、field的value如果是整数 :
hincrby key field count 给field增加一个数字 如果field不存在 回创建一个field
hincrbyfloat key field float 给field增加一个小数
127.0.0.1:6379> hgetall hash
1) "name"
2) "tom"
3) "age"
4) "20"
5) "class"
6) "4"
127.0.0.1:6379> hincrby hash age 3
(integer) 23
127.0.0.1:6379> hincrby hash sex 3
(integer) 3
127.0.0.1:6379> hget hash sex
"3"
127.0.0.1:6379> hkeys hash
1) "name"
2) "age"
3) "class"
4) "sex"
10、计算value的字符串长度
hstrlen key field
127.0.0.1:6379> hgetall hash
1) "name"
2) "tom"
3) "age"
4) "20"
5) "class"
6) "4"
127.0.0.1:6379> hstrlen hash name
(integer) 3
127.0.0.1:6379> hstrlen hash age
(integer) 2
127.0.0.1:6379>
hash内部编码
ziplist(压缩列表): 当hash类型元素(field和value的和)个数小于512个,单个value的长度小于64字节;
hashtable(哈希表):不满足aiplist的条件
object encoding key 查看内部编码
3.列表 list
key-value (一组有序排列的数据) a b c d e 这一组元素他是有序排列的 所以可以通过下标来获取对应的元素,元素最多不超过2^32-1个;
列表的特点:
1、元素的有序性
2、元素可重复
列表的命令:
lpush key value1 value2 …从列表的左边添加元素
rpush key value1 value2 …从列表的右边添加元素
127.0.0.1:6379> lpush list1 a b c d
(integer) 4
127.0.0.1:6379> rpush list2 a b c d
(integer) 4
127.0.0.1:6379> lrange list1 0 -1
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lrange list2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379>
linsert key before|after pivot value 在原有的某个元素前边或后边添加一个新元素
127.0.0.1:6379> linsert list1 before b f
(integer) 5
127.0.0.1:6379> linsert list1 after b g
(integer) 6
127.0.0.1:6379> lrange list1 0 -1
1) "d"
2) "c"
3) "f"
4) "b"
5) "g"
6) "a"
查看列表里的元素
lrange key start stop
127.0.0.1:6379> lrange list1 0 -1
1) "d"
2) "c"
3) "f"
4) "b"
5) "g"
6) "a"
获取下标为index的元素:lindex key index
127.0.0.1:6379> lrange list1 0 -1
1) "d"
2) "c"
3) "f"
4) "b"
5) "g"
6) "a"
127.0.0.1:6379> lindex list1 3
"b"
127.0.0.1:6379> lindex list1 4
"g"
127.0.0.1:6379> lindex list1 2
"f"
127.0.0.1:6379> lindex list1 0
"d"
获取列表元素的个数:llen key
删除列表元素:
lpop key 从列表左边删除一个元素
rpop key 从列表的最右边删除一个元素
lrem key count value 删除指定元素 count>0 表示从列表左端开始删除 count表示删除这个元素的个数 count<0 表示从列表右端开始删除 count的相反数表示删除这个元素的个数,count=0 表示删除表内所有的这个元素 如果要删除的元素不在 则不删除
127.0.0.1:6379> lrange list3 0 -1
1) "4"
2) "a"
3) "3"
4) "a"
5) "2"
6) "a"
7) "1"
8) "a"
127.0.0.1:6379> lrem list3 2 a
(integer) 2
127.0.0.1:6379> lrange list3 0 -1
1) "4"
2) "3"
3) "2"
4) "a"
5) "1"
6) "a"
127.0.0.1:6379> lrem list3 -2 a
(integer) 2
127.0.0.1:6379> lrange list3 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
修改:
lset key index newvalue: 修改列表下标对应的值
127.0.0.1:6379> lrange list3 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> lset list3 0 5
OK
127.0.0.1:6379> lrange list3 0 -1
1) "5"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379>
阻塞:
blpop key timeout 从左开始删除,如果key里的元素已经被删光了 就会阻塞timeout 秒
brpop key timeout 从右开始删除,如果key里的元素已经被删光了 就会阻塞timeout 秒
127.0.0.1:6379> lrange list3 0 -1
1) "5"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> blpop list3 10
1) "list3"
2) "5"
127.0.0.1:6379> blpop list3 10
1) "list3"
2) "3"
127.0.0.1:6379> blpop list3 10
1) "list3"
2) "2"
127.0.0.1:6379> blpop list3 10
1) "list3"
2) "1"
127.0.0.1:6379> blpop list3 10
(nil)
(10.07s)
127.0.0.1:6379>
从左侧开始删除 删除到没有数据时 阻塞 10 秒 结束
列表的内部编码:
ziplist:元素不超过512 每个元素长度不超过64字节
linkedist(链表): 不满足ziplist的条件就会用链表
4.集合 set:
集合也是用来保存多个字符串元素的,他的元素不能重复,他的元素是无序的,不能通过下标查看元素;元素不超过512个 每个元素的长度不能超过64字节;
能够进行集合间的运算 : 交集、差集、并集。
{0,1,2,3,4} {1,4,5,7,8}
交集:{1,4}
差集{0,2,3,5,8}
并集{0,1,2,3,4,5,7,8}
命令:
1、添加元素:
sadd key member1 member2 …
2、删除元素:
srem key member1 member2…
127.0.0.1:6379> sadd myset a b c d
(integer) 4
127.0.0.1:6379> srem myset c
(integer) 1
127.0.0.1:6379>
3、统计元素个数:
scard key
127.0.0.1:6379> scard myset
(integer) 3
127.0.0.1:6379>
4、随机从集合中返回指定个数的元素:
srandmember key [count] count 不写默认返回一个
127.0.0.1:6379> srandmember myset
"a"
5、随机删除集合中指定个数的元素:
spop key [count]
127.0.0.1:6379> spop myset
"b"
6、查看集合内所以元素:
smembers key
127.0.0.1:6379> smembers myset
1) "a"
2) "d"
127.0.0.1:6379>
集合间操作:
交集:sinter key1 key2…
差集:sdiff key1 key2…
并集:sunion key1 key2…
127.0.0.1:6379> smembers myset1
1) "0"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> smembers myset2
1) "1"
2) "2"
3) "3"
4) "4"
5) "6"
6) "7"
127.0.0.1:6379> sinter myset1 myset2
1) "2"
2) "3"
3) "4"
127.0.0.1:6379> sdiff myset1 myset2
1) "0"
2) "5"
127.0.0.1:6379> sunion myset myset1
1) "d"
2) "a"
3) "5"
4) "4"
5) "0"
6) "2"
7) "3"
127.0.0.1:6379>
差集 :key1的元素 减去 key1和key2 的交集剩下的所有元素
myset3 [a b c d e f]
myset4 [a b c d i h k]
myset3-myset4 [e f]
myset4-myset3 [i h k]
保存集合间的结果 :
交集:sinterstore destination (表示是交集这个结果的集合名)key1 key2 …
差集:sdiffstore destination (表示是差集这个结果的集合名)key1 key2 …
并集:sunionstore destination (表示是并集这个结果的集合名)key1 key2 …
127.0.0.1:6379> sinter myset1 myset2
1) "2"
2) "3"
3) "4"
127.0.0.1:6379> sinterstore des1 myset1 myset2
(integer) 3
127.0.0.1:6379> sdiffstore des2 myset1 myset2
(integer) 2
127.0.0.1:6379> sunionstore des3 myset1 myset2
(integer) 8
127.0.0.1:6379> smembers des1
1) "2"
2) "3"
3) "4"
集合的内部编码:
intset (整数集合)当集合中的元素都是整数且元素个数少于512个 redis会使用intset来保存数
hashtable:不满足intset使用
5.有序集合 zset
元素不重复,通过给元素加上一个分数(score)来排序;
命令
1、添加成员:
zadd key score member …
127.0.0.1:6379> zadd zset1 100 tom
(integer) 1
127.0.0.1:6379> zadd zset1 150 li 120 zhang
(integer) 2
2、统计有序集合的元素个数:
zcard key
127.0.0.1:6379> zcard zset1
(integer) 3
3、获取某个成员的分数:
zscore key member
127.0.0.1:6379> zscore zset1 li
"150"
127.0.0.1:6379>
3、获取成员排名:
zrank key member 分数由低到高排 返回的数字就是排名
127.0.0.1:6379> zrank zset1 tom
(integer) 0
127.0.0.1:6379> zrank zset1 zhang
(integer) 1
127.0.0.1:6379> zrank zset1 li
(integer) 2
zrevrank key member 分数由高到低排 (rev 反转)
127.0.0.1:6379> zrevrank zset1 tom
(integer) 2
127.0.0.1:6379> zrevrank zset1 li
(integer) 0
127.0.0.1:6379> zrevrank zset1 zhang
(integer) 1
5、删除成员:
zrem key member1 member2…
127.0.0.1:6379> zrem zset1 tom
(integer) 1
127.0.0.1:6379> zcard zset1
(integer) 2
6、增加元素的分数:
zincrby key incr-score(增加的分数)member
127.0.0.1:6379> zincrby zset1 40 zhang
"160"
7、返回查询指定排名范围的成员:
zrange key start end [withscores] 由低到高
zrevrange key start end [withscores] 由高到低
127.0.0.1:6379> zrange zset1 0 1 withscores
1) "li"
2) "150"
3) "zhang"
4) "160"
127.0.0.1:6379> zrevrange zset1 0 1 withscores
1) "zhang"
2) "160"
3) "li"
4) "150"
127.0.0.1:6379>
8、查询指定分数范围的成员:
zrangebyscore key minscore maxscore [withscores] [ limit offset count] 由低到高
zrevrangebyscore key maxscore minscore [withscores] [ limit offset count] 由高到低
127.0.0.1:6379> zrangebyscore zset1 100 170 withscores
1) "tom"
2) "100"
3) "li"
4) "150"
5) "zhang"
6) "160"
127.0.0.1:6379> zrangebyscore zset1 100 170 withscores limit 1 2
1) "li"
2) "150"
3) "zhang"
4) "160"
-inf : 无限小
+inf: 无限大
127.0.0.1:6379> zrangebyscore zset1 100 +inf withscores limit 1 3
1) "li"
2) "150"
3) "zhang"
4) "160"
5) "wang"
6) "250"
9、查询指定分数范围的成员个数:
zcount key min max
127.0.0.1:6379> zcount zset1 -inf +inf
(integer) 4
10、删除指定排名范围的成员:
zremrangebyrank key start stop
11、删除指定分数范围的成员:
zremrangebyscore key start stop
127.0.0.1:6379> zremrangebyrank zset1 0 1
(integer) 2
127.0.0.1:6379> zremrangebyscore zset1 210 +inf
(integer) 1
127.0.0.1:6379> zcard zset1
(integer) 1
集合间的操作:
交集:zinterstore destination numkeys key1 key2 [weights num1 num2] [aggregate sum | min |max ]
numkeys:交集计算的有序集合的个数
weights:权重将对应的分数按照倍数关系进行运算
127.0.0.1:6379> zrangebyscore zset -inf +inf withscores
1) "tom"
2) "100"
3) "li"
4) "150"
5) "wang"
6) "170"
7) "zhang"
8) "200"
127.0.0.1:6379> zrangebyscore set1 -inf +inf withscores
1) "xiaowang"
2) "35"
3) "xiaoming"
4) "40"
5) "tom"
6) "70"
7) "li"
8) "150"
127.0.0.1:6379> zinterstore zset2 2 zset set1 weights 2 0.5 aggregate sum
(integer) 2
127.0.0.1:6379> zrange zset2 0 -1 withscores
1) "tom"
2) "235"
3) "li"
4) "375"
在交集计算中 求和 两个交集进行的操作位
两个有序集合的交集为 tom 和 li
按照权重 在set2中tom的分数=(zset中的 tom值 X2) + (set1 中tom值 X 0.5)= 100X2+70X0.5=235
在set2中li的分数=(zset中的li的值x2)+ (set1中li值 X0.5)= 150X2+150X0.5=375
并集:zunionstore destination numkeys key1 key2 [weights num1 num2] [aggregate sum | min |max ]
内部编码:
ziplist:元素个数2^32-1,单个元素长度不超过64M
skiplist(跳跃表):