redis

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(跳跃表):

键过期:已经存在的键值对设置过期时间:expire key 数字(单位是秒),当超过过期时间,这个键会自动删除;
ttl key:查看这个键的过期时间,返回数字>0,表示还有数字秒过期,返回1表示没有给这个键设置过期时间,返回2,表示这个键不存在或者已过期;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值