# redis-01-常用操作

如今是8102年了,作为一个老牌的缓存数据库redis,依然非常强劲。准备把它系统地过一遍,计划分两部分来进行:

1.redis使用

2.redis原理分析

# redis通识

命令

这些是通用命令,对所有redis的数据结构都可以操作

expire 设置过期时间
del 删除键值

操作结果

正常操作返回OK 或 (integer) 加数字

更新操作返回(integer) 0

空值是 (nil)

# redis的数据结构

Redis 有 5 种常用的基础数据结构,分别为:string (字符串)、list (列表)、set (集合)、hash (哈希) 和 zset (有序集合)

除了这5种还有bitmap,hyperloglog等,本次只介绍这5种。

Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。不同类型的数据结构的差异就在于 value 的结构不一样。

# 字符串

设置键值对

127.0.0.1:6379> set name1 boy
OK

获取该键值

127.0.0.1:6379> get name1
"boy"

批量设置

127.0.0.1:6379> mset name1 boy name2 girl name3 none
OK

批量获取

127.0.0.1:6379> mget name1 name2 name3
1) "boy"
2) "girl"
3) "none"

设置过期时间

用set + codehole

127.0.0.1:6379> SETEX name1 2 codehole  #设置2秒过期
OK
127.0.0.1:6379> get name1  #2秒后该键值消失
(nil)

用expire

127.0.0.1:6379> expire name2 2
(integer) 1
127.0.0.1:6379> get name2
(nil)

计数 如果 value 值是一个整数,还可以对它进行自增操作。

127.0.0.1:6379> set val 27
OK
127.0.0.1:6379> get val
"27"
127.0.0.1:6379> INCR val  #自增1
(integer) 28
127.0.0.1:6379> get val
"28"
127.0.0.1:6379> INCRBY val 5 #加5
(integer) 33
127.0.0.1:6379> get val
"33"
127.0.0.1:6379> INCRBY val -3 #减3
(integer) 30
127.0.0.1:6379> get val
"30"

# 列表

可以理解为数据结构中的双向链表,常用于队列。

向列表中添加元素(右边进)

127.0.0.1:6379> rpush books python php golang c #右边进
(integer) 4
#lpush是左边进,后面的例子都是右边进的

查看该列表长度

127.0.0.1:6379> llen books
(integer) 4

查看该列表的元素

127.0.0.1:6379> lrange books 0 3
1) "python"
2) "php"
3) "golang"
4) "c"

查看该列表的所有元素

127.0.0.1:6379> lrange books 0 -1
1) "python"
2) "php"
3) "golang"
4) "c"

右边进左边出(先进先出):队列

127.0.0.1:6379> lpop books
"python"
127.0.0.1:6379> lrange books 0 3
1) "php"
2) "golang"
3) "c"

右边进右边出(先进后出):栈

127.0.0.1:6379> rpop books
"c"
127.0.0.1:6379> lrange books 0 3
1) "php"
2) "golang"

当列表弹出了最后一个元素之后,该数据结构自动被删除,内存被回收。

127.0.0.1:6379> rpop books
"golang"
127.0.0.1:6379> rpop books
"php"
127.0.0.1:6379> lrange books 0 3
(empty list or set)

lindex索引

慎用

127.0.0.1:6379> rpush books python php golang c
(integer) 4
127.0.0.1:6379> lindex books 2 #正方向
"golang"
127.0.0.1:6379> lindex books -3 #反方向
"php"

ltrim保留范围内的值

慎用

127.0.0.1:6379> ltrim books 1 2 #保留范围是1到2的值
OK
127.0.0.1:6379> lrange books 0 3
1) "php"
2) "golang"

# Hash

创建一个Hash

127.0.0.1:6379> hset books golang "hello golang"
(integer) 1
127.0.0.1:6379> hset books php "hello php"
(integer) 1
127.0.0.1:6379> hset books python "hello python"
(integer) 1
127.0.0.1:6379> hset books c "hello c"
(integer) 1

获取该Hash的所有元素

127.0.0.1:6379> hgetall books
1) "golang"
2) "hello golang"
3) "php"
4) "hello php"
5) "python"
6) "hello python"
7) "c"
8) "hello c"

获取指定key的元素

127.0.0.1:6379> hget books golang
"hello golang"

更新指定的key

127.0.0.1:6379> hset books golang "hi golang"
(integer) 0
127.0.0.1:6379> hget books golang
"hi golang"

设置多个

127.0.0.1:6379> hmset books java "hi java" js "hi js"
OK

计数

127.0.0.1:6379> hset books page 100
(integer) 1
127.0.0.1:6379> HINCRBY books page 1
(integer) 101
127.0.0.1:6379> hget books page
"101"

# 集合

集合内的键值对是唯一无序的,它和列表的区别是:列表是序的,可重复的。

添加一个元素

127.0.0.1:6379> sadd books python
(integer) 1
127.0.0.1:6379> smembers books #查看值
1) "python"
127.0.0.1:6379> sadd books python #重复添加
(integer) 0
127.0.0.1:6379> smembers books #还是只有一个
1) "python"
127.0.0.1:6379>

检查某个值是否存在

127.0.0.1:6379> sismember books abc #不存在abc
(integer) 0
127.0.0.1:6379> sismember books python #python存在
(integer) 1

获取长度

127.0.0.1:6379> sadd books php
(integer) 1
127.0.0.1:6379> scard books
(integer) 1
127.0.0.1:6379> sadd books go
(integer) 1
127.0.0.1:6379> scard books
(integer) 2

弹出

127.0.0.1:6379> sadd books python php go
(integer) 1
127.0.0.1:6379> spop books    #弹出一个
"python"
127.0.0.1:6379> smembers books
1) "php"
2) "go"

# 有序集

可以理解为加强型的集合,它可以对value设置一个score,用来排序

添加元素

127.0.0.1:6379> zadd user 98 xiaohong #添加个用户xiaohong,值是98
(integer) 1
127.0.0.1:6379> zadd user 99 xiaoming 
(integer) 1
127.0.0.1:6379> zadd user 97 xiaoli
(integer) 1
127.0.0.1:6379> zadd user 98 xiaogang
(integer) 1

正序

127.0.0.1:6379> zrange user 0 -1
1) "xiaoli"
2) "xiaogang"
3) "xiaohong"
4) "xiaoming"

倒序

127.0.0.1:6379> zrevrange user 0 -1
1) "xiaoming"
2) "xiaohong"
3) "xiaogang"
4) "xiaoli"

获取score

127.0.0.1:6379>  zscore user xiaohong
"98"

查看长度

127.0.0.1:6379> zcard  user
(integer) 4

查看正序的排名

127.0.0.1:6379> zrank user xiaohong
(integer) 2
127.0.0.1:6379> zrank user xiaoli
(integer) 0

查看倒序的排名

127.0.0.1:6379> zrevrank user xiaohong
(integer) 1
127.0.0.1:6379> zrevrank user xiaoli
(integer) 3

查看某个范围的value

127.0.0.1:6379> zrangebyscore user 98 99
1) "xiaogang"
2) "xiaohong"
3) "xiaoming"

查看某个范围的value并返回对应的score

127.0.0.1:6379> zrangebyscore user 98 99  withscores
1) "xiaogang"
2) "98"
3) "xiaohong"
4) "98"
5) "xiaoming"
6) "99"

删除某个value

127.0.0.1:6379> zrem user xiaogang
(integer) 1

#

我在学习的过程中参考的是Redis 深度历险:核心原理与应用实践,有兴趣的可以去读下。