Wee6-第5天:Redis
安装
$ sudo apt install redis-server -y
安装成功后
Setting up redis-server (5:4.0.9-1ubuntu0.2) ...
Created symlink /etc/systemd/system/redis.service → /lib/systemd/system/redis-server.service.
Created symlink /etc/systemd/system/multi-user.target.wants/redis-server.service → /lib/systemd/system/redis-server.service.
Processing triggers for systemd (237-3ubuntu10.19) ...
Processing triggers for ureadahead (0.100.0-20) ...
查看redis服务的状态
$ sudo service redis status
redis配置文件位置:
$ sudo vi /etc/redis/redis.conf
database 16 表示默认有16个库,从0开始, 切换库可以使用
127.0.0.1:6379 > select 8
port 6379 端口号
redis的日志文件
$ sudo cat /var/log/redis/redis-server.log
连接redis
$ redis-cli
127.0.0.1:6379>
退出redis的连接
127.0.0.1:6379> exit
连接远程的redis
$ redis-cli -h 10.36.174.90
10.36.174.90:6379>
确定redis的配置文件中的69行的bind 127.0.0.1 改成0.0.0.0, 且重新启动redis服务。
$ sudo service redis restart
设置授权口令
$ sudo vi /etc/redis/redis.conf
....
# requirepass foobared
....
通过查询: /reqiurepass 找到设置口令的位置,将内容改为
requirepass disen666
修改之后保存并重新服务
带口令的方式连接redis服务
$ redis-cli -a disen666 -h 10.36.174.19
127.0.0.1:6379> keys *
可以正常显示查询的所有key对象。
Redis的持久化方式
-
RDB 数据存储
将内存的数据保存到硬盘中。
在配置文件中使用save 配置项。 save
-
AOF 追加日志方式
每条命令都会写到日志中,通过日志的追加方式来存储的数据。
还原数据,则重新执行日志中的命令。
在配置文件中使用 appendonly 或appendfilename 等相关项配置。
数据类型
数据类型是指key对象的value值的类型
- string 字符串类型
- list列表类型
- hash(字典)类型
- set集合类型
- zset有序集合类型
基本操作
查看、删除、过期时间
-
查看 keys
> keys *
*表示所有(任意长度任意字符),如:查询key对象名中包含 version的字符所有对象。
> keys *version*
-
删除key对象
> del key1 [key2 ...]
del 删除key对象,可以同时删除多个key
-
设置key的过期时间
> set token abc123 ex 10
设置key对象value时通过ex 设置key的过期时间, 时间单位: 秒
查看key的过期时间(剩余的时间)
> ttl token
别外,通过expire命令设置key的过期时间
> set token abc123 > expire token 30 > ttl token > get token
设置token的过期时间为30秒
刷新库
> flushdb
刷新当前选择的库的所有key对象,即删除或清空当前库
> flushall
刷新所库的所有key对象,即删除或清空16个库。
查看key对象的类型
> type token
查看token的对象类型, 即token对象的value值类型.
string类型操作
-
增加key
set key value [ex seconds]
> set name disen ex 20
-
读取key
get key
> get name
-
批量增加和读取
语法:
mset key value [key value …]
mget key [key …]
> mset name disen age 20 city 西安 salary 3000 > mget name age city 1) "disen" 2) "20" 3) "\xe8\xa5\xbf\xe5\xae\x89"
-
自增与自减
语法:
incr key # 自增1
incrby key number # 自增number
decr key # 自减1
decrby key number # 自减number
> set stock 100 > incr stock 101 > incrby stock 100 201 > decr stock 200 > decrby stock 10 190
-
追加字符串和截取字符串
语法:
append key 新字符串
substr key start end # 截取字符串
> set name disen > append name ,19,3000 > get name disen,19,3000
> substr name -4 -1 3000
截取字符串可以使用负数,即从右边开始。
list操作
list类型即表示某一个key的value是list列表类型, 表示方式如: key [1, 2, 3, 4]
-
压入与弹出成员
语法:
rpush key value [value …]
lpush key value [value …]
rpop key 从右边弹出一个元素
lpop key 从左边弹出一个元素
> lpush user_token t1 t2 t3 > lpop user_token t3 > rpush user_token t9 > lrange user_token 0 -1 1) t2 2) t1 3) t9 > rpop user_token t9
-
读取与删除
语法:
lrange key start end 如果start 为0, end -1 则表示所有的元素
lindex key index 查看指定index位置的元素
llen key 读取key的元素的长度或个数
ltrim key start end 截取 [start, end]的元素, 其它的元素则被删除
lrem key count value 删除key列表中count个value的元素
-
设置指定位置的值
语法:
lset key index value 设置key中index位置元素值为value
> LRANGE cart_1 0 -1 1) "455" 2) "650" 3) "100" 4) "2" > lset cart_1 1 651 # 修改cart_1 的第2个元素的值为651 > lindex cart_1 1 651
案例分析:
通过redis的list实现高并发的用户秒杀业务的流程是:
key : buy_tasks
成员的结构: user_id:datetime:goods_id:cnt
会员从UI页中抢购:
会员: 190001, 商品: 9008 / 西瓜 9Kg / 3份 , 20190815032015
会员: 190002, 商品: 9009 / 西瓜 3Kg / 2份 , 20190815032017
会员: 190003, 商品: 9010 / 西瓜 2.5Kg / 1份 , 20190815032019
> lpush buy_tasks 190001:20190815032015:9008:3
> lpush buy_tasks 190002:20190815032017:9009:2
> lpush buy_tasks 190003:20190815032019:9010:1
后端业务处理进程,从redis的任务队列中读取业务,并一一处理。
> rpop buy_tasks
190001:20190815032015:9008:3
set/zset集合操作
set集合的数据是无序的, 且不可重复;
list列表数据是有序的,且可以重复。
-
添加元素和删除元素
语法:
sadd key member1 [member2 …] 添加一个或多个元素到key的集合对象中
srem key member 删除成员
spop key 随机返回一个成员,且删除
-
查看元素
语法: smembers key 查看所有key集合中的元素
sismember key member 判断member是否在key 的集合中
srandmember key [ count ] 随机抽取count (默认为1)个的成员
-
集合交、并、差等运算
语法:
sinter key1 key2 [key3 …] 交集
sinterstore dstkey key1 key2 [key3 …] 交集并保存到dstkey中
sunion key1 key2 [key3 …] 并集
sunionstore dstkey key1 key2 [key3 …] 并集并保存到dstkey中
sdiff key1 key2 … 差集
sdiffstore dstkey key1 key2 差集并保存到dstkey中
-
zset有序集合
-
添加元素
语法: zadd key score member
> zadd rank 1 9001
score成员的排行的分数值,默认从小到大排序的。
-
删除元素
语法: zrem key member
> zrem rank 9001
-
查看元素
语法: zrange key start end [withscores]
zrevrange key start end [withscores]
withscores 显示成员的分数
> zrevrange rank 0 2 withscores
显示排行的前3名,且带有分数
-
自增
语法: zincrby key increment member
increment 是指步长, 可以理解为分数。
> zincrby rank 10000 9003
-
hash操作
hash结构是基于散列函数,实现的key:value的数据结构,key是唯一的, 只要key的哈希值是唯一即可。
案例分析:
针对秒杀的结果进行存储, 规则中只秒杀100件, 每位用户只能1件
解决方案: 使用redis的hash结构 存储秒杀结果。
key : qbuy_result_activeid
value-field: user_id
value_value: goods_id
假如 刚接收 190001:20190815032015:9008:3 秒杀任务信息, 首先判断当前
qbuy_result_activeid 中是否已达到100件
> hlen qbuy_result_activeid
经过程序代码的判断,没有达到100件,接下判断当前的用户是否已秒杀过。
> hexists qbuy_result_activeid 190001
经过判断之后,发现用户没有秒杀过,则存放结果如下:
> hset qbuy_result_activeid 190001 9008