第二部分 redis
Redis官网 https://redis.io
Redis 中国镜像
Redis中国用户组(CRUG) http://www.redis.cn/download.html
Redis 数据类型的应用场景
发现:当清空hash、list、set、zset的值时,会把与之对应的key释放!
redis类型
- string 字符串类型(一个键最多存储512M)
是最简单的类型,你可以理解成与 Memcached 是一模一样的类型,一个 key 对应一个
value,其上支持的操作与 Memcached 的操作类似,但它的功能更丰富
- SET:设置key对应值为value(会覆盖)
语法:SET key value
set str1 'xdl'
- GET:根据KEY找到对应的值
语法:GET key
get str1
注意:如果key不存在 返回nil
- MSET:一次设置多个键值对(会覆盖)
语法:MSET key value [key value .......]
说明:mset 键1 值1 键2 值2 ...
mset str4 'xdl' str5 'itxdl' str6 'xdlo2o'
注意:会覆盖
- MGET:一次得到多个键值
语法:MGET key key
说明:mget 键1 键2 键3
mget str4 str5 str6
- SETNX:只有KEY不存在的时候才能设置成功
语法:SETNX key value
setnx str1 'hello'
说明:如果存在,返回 0;如果不存在,返回1
注意:不会覆盖
- MSETNX:一次设置多个key-value对
语法:MSETNX key value [key value .....]
msetnx str10 'a' str11 'b' str12 'c'
msetnx str12 'd' str13 'e'
说明:返回0:创建失败;返回1:创建成功
注意:不会覆盖,只有所有的key都不存在的时候才会成功
- SETEX:设置一个KEY并且设置一个过期时间
语法:SETEX key seconds value
说明:setex 键 秒数 值
setex str8 30 'xdl'
注意:会覆盖
- PSETEX: 以毫秒为单位设置KEY的生存周期
语法:PSEREX key milliseconds value
psetex set9 20000 'hello'
- TTL 查看键值生命周期。
语法:ttl KEY
ttl str8
- GETSET:设置指定key的值,并返回旧值
语法:GETSET key value
set str2 'itxdl'
getset str2 'xdl'
注意:当key不存在返回nil,但不影响执行
- SETRANGE:相当于字符串替换
语法:SETRANGE key offset value
说明:setrange 键 第几个字符开始 新值
SET str7 'hello'
SETRANGE str7 5 'xdl'
setrange str7 20 'test'
注意: 如果设置key原来的字符串的长度比偏移量小,就会以零字节(\x00)来填充
- GETRANGE:返回字符串中的一部分
语法:GETRANGE key start end
说明:getrange 键 从第几个开始 到第几个结束
getrange str1 0 0 #获取第一个字符
getrange str1 0 1 #获取前两个字符
getrange str1 0 -1 #获取所有字符
getrange str1 0 -2 #去掉最后一位
getrange str1 0 1000
getrange str1 -1 10 #返回空字符串
- INCR:对key中存储的数字加1
语法:INCR key
说明:只能针对数字
set nums 10
incr nums
incr total
注意:key如果不存在,则会先初始化为0,在进行INCR操作
- DECR:将key中存储的数字减1
语法:DECR key
说明:只能针对数字
set nums1 1
decr nums1
注意:key如果不存在,则会先初始化为0,在进行DECR操作
- INCRBY:将key中存储的数字加上指定增量
语法:INCRBY key INCREMENT
set nums 10
incrby nums 5
incrby nums 1.5 #报错,只能是整数
说明:只能使用整数
注意:key如果不存在,则会先初始化为0,在进行INCRBY操作
- DECRBY:将key中存储的数值减指定值
语法:DECRBY key decrement
set total 20
decrby total 5
说明:只能使用整数
注意:key如果不存在,则会先初始化为0,在进行DECRBY操作
- APPEND:通过APPEND将值追加到字符串末尾
语法:APPEND key value
set str20 'xdl'
append str20 'o2o'
- STRLEN:获取key的字符串长度
语法:STRLEN key
strlen str4
- DEL 删除键
语法:DEL key
set test feng
del test
- INCRBYFLOAT:将key中存储的数字加上指定浮点数
语法:INCRBYFLOAT key increment
set num 1
incrbyfloat num 2.1
注意: 2.6.5版本以下不存在该方法
- hash类型
Hash 是一个 string 类型的 field 和 value 的映射表.它的添加、删除操作都是 O(1)
(平均)。
hash 特别适合用于存储对象。相较于将对象的每个字段存成单个 string 类型。将一个对象存
储在 hash 类型中会占用更少的内存,并且可以更方便的存取整个对象。
- HSET:将哈希表中的key中的field设置成指定的value
语法:HSET key field value
说明:hset 键 字段 值
hset h1 username 'zhangsan'
hset h1 password '123'
hset h1 age '18'
注意:会覆盖原值
- HGET:返回哈希表key中给的field的值
语法:HGET key field
说明:hget 键 字段
hget h1 username
hget h1 age
```
3. HSETNX:将hash表中的field设置成指定的值,只有field不存在才能成功,如果field存在,操作无效
语法: `HSETNX key field value`
hsetnx h1 aaa '20'
hsetnx h1 aaa '21'
注意:如果存在返回0,如果不存在 ,返回1.
4. HMSET:通过多个 field value设置到hash表key中
语法: `HMSET key field1 value1 field2 value2 .....`
hmset h2 username 'lisi' age '20' password '456'
说明:批量存值
5. HMGET:一次获得hash表key中多个field的值
语法: `HMGET key field field .....`
hmget h2 username age password
hmget h2 username age password aaa
注意:如果hash表key中field不存在,返回nil
6. HLEN:返回hash表key中的field的数量
语法: `HLEN key`
hlen h2
说明:查看键中有多少个字段
7. HGETALL:返回hash表key中所有的field和value
语法: `HGETALL key`
HGETALL h2
说明:查看键中所有字段 值
8. HKEYS:返回hash表key中的所有的field
语法: `HKEYS key`
```
hkeys h2
说明:查看所有键
- HVALS:返回hash表key中所有的field的对应值
语法:HVALS key
hvals h2
说明:查看所有值
- HDEL:删除hash中key的指定field,可删除一个或多个
语法:HDEL key field field .....
hdel h2 username
hgetall h2
```
11. HINCRBY :给hash表key中的field做增量操作
语法: `HINCRBY key field increment`
```
hset h3 age 20
hincrby h3 age 5 #age递增5
注意: 没有递减,如果 field不存在则添加这个字段,然后incrby
- HINCRBYFLOAT:给hash表key中的field做增量浮点操作
语法:HINCRBYFLOAT key field increment
hset h3 aaa '12.2'
hincrbyfloat h3 aaa 2.5
- HEXISTS:检测hash中key的field是否存在
语法:HEXISTS key field
hexists h2 username
hexists h2 aaa
说明:有返回1;没有返回0;
- list(双向列表) 类型
list 是一个链表结构,主要功能是 push、pop、获取一个范围的所有值等等,操作中 key 理
解为链表的名字。
Redis 的 list 类型其实就是一个每个子元素都是 string 类型的双向链表。链表的最大长度是(2
的 32 次方)。我们可以通过 push,pop 操作从链表的头部或者尾部添加删除元素。这使得 list
既可以用作栈,也可以用作队列。
有意思的是 list 的 pop 操作还有阻塞版本的,当我们[lr]pop 一个 list 对象时,如果 list 是空,
或者不存在,会立即返回 nil。但是阻塞版本的 b[lr]pop 可以则可以阻塞,当然可以加超时时
间,超时后也会返回 nil。为什么要阻塞版本的 pop 呢,主要是为了避免轮询。举个简单的
例子如果我们用 list 来实现一个工作队列。执行任务的 thread 可以调用阻塞版本的 pop 去获
取任务这样就可以避免轮询去检查是否有任务存在。当任务来时候工作线程可以立即返回,
也可以避免轮询带来的延迟。
- LPUSH:向列表左端添加元素
语法: LPUSH key value value ....
说明:lpush 键 值1 值2 ...
lpush list1 a b c
注意:值从右往左插入
- LPUSHX:向列表头部添加元素,只有key存在才添加
语法:LPUSHX key value
lpushx list1 a
- RPUSH:向列表右端添加元素
语法:RPUSH key value ....
rpush list1 d e
说明:值从左到右插入
- RPUSHX:向列表尾部添加元素,只有key存在才添加
语法: RPUSHX key value
rpushx list1 b
- LRANGE:获取列表片段
语法:LRANGE key start stop
lrange list1 0 -1 #查看列表中所有值
#列表中的下标,索引。从左到右。0 1 2 3 4。从右到左。-1 -2 -3 -4 -5
- LINDEX:获取指定索引元素上的值
语法:LIDEX key index
```
lindex list1 -1
7. LINSERT 向列表中插入元素
语法: `LINSERT key BEFORE|AFTER pivot value`
lpush list1 a b c d
linsert list1 before 2(值) 5(值)。说明:在某个值的前面插入
linsert list1 after 2(值) 5(值)。说明:在某个值的后面插入
注意:如果检索值有重复,则只对第一个生效!
8. LSET:设置指定元素的值
语法: `LSET key index value`
lset list1 2 7 #下标为2,修改后的值为7
9. LREM:删除列表中的指定值
语法:`LREM key count value`
> count >0 :从列表头部开始,向尾部搜索,移除与value相等的元素,移除count个
count <0 :从列表的尾部开始,向头部搜索,,移除与value相等的元素,移除count个
count = 0:移除列表中所有与value相等的元素
```
lpush list3 a b c d a e b d c b e d
lrem list3 2 a
lrem list3 -2 b
lrem list3 0 d
```
10. LTRIM:只保留列表片段
语法:`LTRIM key start stop`
ltrim list3 0 3
说明:保留start-stop(下标)的值,其余删除掉。
11. LPOP:将列表头部的元素弹出
语法: LPOP key
lpop list1
12. RPOP:弹出列表尾部元素
语法: RPOP key
rpop list1
13. LLEN:获取列表长度
语法:`LLEN key`
llen list1
14. RPOPLPUSH:将元素从一个列表转移到另一个列表
语法: `RPOPLPUSH source destination`
lpush list5 a b c
lpush list6 x y z
rpoplpush list5 list6
注意:一次移动一个元素
4. **set(无序集合)**
> set 是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合
求交并差等操作,操作中 key 理解为集合的名字。
Redis 的 set 是 string 类型的无序集合。
注意:集合中不能有重复值!添加的时候会把重复的值删除掉!
1. SADD:向集合中添加一个元素
语法: `SADD key value [value2 ...]`
sadd s1 xdl
sadd s1 itxdl
sadd s1 1 2 3
说明:创建集合并添加数值
2. SMEMBERS:查看集合中所有的元素
语法: `SMEMBERS key`
smembers set1
3. SRANDMEMBER:随机返回集合中元素
语法: `SRANDMEMBER key count`
> 注意:
count 为正数,而且小于集合中的元素,返回一个随机元素的集合数组,
count 为正数,而且大于集合中的个数的时候,返回整个集合
count 为负数,返回一个数组,数组中的成员可能出现重复,数组的长度是count的绝对值
count 默认为1
```
srandmember set1 #随机取出一个值
srandmember set1 2 #随机取出二个值
srandmember set1 -2 #随机取出二个值,可以重复出现
```
4. SPOP:删除并返回集合中的随机元素
语法: `SPOP key`
spop set1
说明:随机删除一个值
5. SREM:删除集合中一个或多个成员
语法: `SREM key member [member ....]`
srem set1 xdl
说明:删除指定的一个值
6. SCARD:返回集合中元素个数
语法: `SCARD key`
scard set2
7. SINTER:返回集合的交集
语法: `SINTER key key key ...`
sinter set2 set3
sadd set5 c
sinter set2 set3 set5
8. SINTERSTORE:将交集的结果保存到指定的集合当中
语法: `SINTERSTORE destination key key ....`
sinterstore set7 set2 set3
说明:查看交集并保存到set7
9. SDIFF:返回集合的差集
语法: `SDIFF key key ....`
sadd set2 a b c d
sadd set3 c d e f
sadd set4 a e
sdiff set3 set2 #求set3 与 set2 的差集,以set3为主数据
sdiff set3 set2 set4 #求set3 与 set2、set4 的差集,以set3为主数据
注意:返回的结果以第一个集合为主数据进行匹配返回!
10. SDIFFSTORE:将差集的结果保存到指定的集合当中
语法: `SDIFFSTORE destination key key ....`
sdiffstore set6 set2 set3
说明:查看差集并保存到set6
11. SUNION:返回集合中并集
语法: `SUNION key key ...`
sunion set2 set3
sunion set2 set3 set4
说明:将集合合并,如果有重复的数据只取一个
12. SUNIONSTORE:将并集的结果保存到指定的集合当中
语法: `SUNIONSTORE destination key key ....`
sunionstore set8 set2 set3
说明:查看并集并保存到set8
13. SMOVE:将集合中的元素移动另一个集合中
语法: `SMOVE source destination member`
smove s1 s2 5
说明:移动s1里的5到s2中
14. SISMEMBER:检查member是否是集合中的成员
语法: `SISMEMBER key member`
```
SISMEMBER set1 xdl
注意:在返回1;不在返回0;
-
zset(有序集合)
- ZADD:将元素及其分数添加到集合中
语法:ZADD key score member [score member]
说明:zadd 键 分数 值 分数 值
- ZADD:将元素及其分数添加到集合中
ZADD zset 100 xdl
ZADD zset 98 zhangsan 98 list 80 test 78 test1 85 test2
ZADD zset 60 test2 67 test3 56 test4
注意:创建有序集合并添加元素。如果值重复,则覆盖,如果不重复,则添加
2. ZRANGE:按照元素分数从小到大的顺序返回指定索引start到stop之间所有元素(包含两端)
语法:ZRANGE key start stop [WITHSCORES]
ZRANGE zset 0 -1
ZRANGE zset 0 -1 WITHSCORES
ZRANGE zset 0 2 WITHSCORES
ZRANGE zset 0 2000 WITHSCORES
ZRANGE zset 1000 2000 WITHSCORES
ZADD zset 60 test6 60 test7 60 test8 60 test9