本系列会持续输出Redis相关的知识整理,提升自己的同时希望能帮助到有需要的朋友,持续输出…持续输出…持续输出…
目录传送本篇文章会简单整理一下Redis核心数据结构和基本使用。
数据结构种类字符串常用操作
//存入字符串键值对 SET key value eg: set redis redis"
//批量存储字符串键值对 MSET key value [key value …] eg: MSET key1 "Hello" key2 "World
//存入一个不存在的字符串键值对,如果键值存在则返回0,插入失败。 SETNX key value eg: setnx redis redis
//获取一个字符串键值 GET key eg get hello
//批量获取字符串键值 MGET key [key …] eg: mget key1 key2
//删除一个键 DEL key [key …] eg : del redis
//设置一个键的过期时间(秒) EXPIRE key seconds eg: expire key1 1
原子加减
//将key中储存的数字值加1 INCR key DECR key //将key中储存的数字值减1 INCRBY key increment //将key所储存的值加上increment DECRBY key decrement //将key所储存的值减去decrement
操作如下
127.0.0.1:6379> set key1 1
OK
127.0.0.1:6379> get key1
"1"
127.0.0.1:6379> incr key1
(integer) 2
127.0.0.1:6379> get key1
"2"
127.0.0.1:6379> decr key1
(integer) 1
127.0.0.1:6379> get key1
"1"
127.0.0.1:6379> incrby key1 2
(integer) 3
127.0.0.1:6379>
String类型的字符串应用场景
- 单值缓存:使用set get进行操作。
- 对象缓存 这里有两种存储方式如下 1.
set user:1 value(jsong串)
2.使用mget进行操作假设user有 name以及balance两个变量。
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> MSET user:1:name ccc user:1:balance 1888
OK
127.0.0.1:6379> MGET user:1:name user:1:balance
1) "ccc"
2) "1888"
127.0.0.1:6379>
那么对于对象缓存,我们大部分使用都是 第一种方式,因为操作简单,但是如果一个对象的属性如果要被修改的话我们需要拿到这个Json串进行反序列化,然后在进行修改在存储,这样一来我们势必会浪费一定的性能,如果使用 第二种方式的话,我们只需根据key(user)取出需要修改的变量即可。因此我们也是比较推荐使用第二种方式进行存储的。
- 简单的分布式锁
SETNX product:10001 true //返回1代表获取锁成功
SETNX product:10001 true //返回0代表获取锁失败
// 如果为1 执行业务操作
DEL product:10001 //执行完业务释放锁
SET product:10001 true ex 10 nx //防止程序意外终止导致死锁
我们知道setnx会对不存在的键值进行操作,我们可以利用这一点进行简单的分布式锁操作,例如多台机器需要对同一个商品进行操作,例如商品(10001)如果你取回的值代表 1 表示没有其他操作,你可以进行自己的业务操作。
- 计数器 INCR 1.阅读量或者点击量等
127.0.0.1:6379> set articleCount 1
OK
127.0.0.1:6379> incr articleCount
(integer) 2
127.0.0.1:6379>
2.分布式系统全局序列号
127.0.0.1:6379> incr orderId
(integer) 1
127.0.0.1:6379> incr orderId
(integer) 2
127.0.0.1:6379>
问题:
例如订单系统(集群)每生成一个订单都需要在redis里使用该命令进行记录一次,如果量大的话会频繁访问redis,对性能也会产生巨大的损耗。
解决:
我们使用 incrby orderId 1000
进行批量生成序列ID分发给各个系统,每个系统维持自己的序列,然后进行批量导入,这样会减少与Redis的频繁交互。 并且该指令是自增的形式,会记录最后一个ID并在之上进行操作。
127.0.0.1:6379> incr orderId
(integer) 1
127.0.0.1:6379> incr orderId
(integer) 2
127.0.0.1:6379> incrby orderId 1000
(integer) 1002
127.0.0.1:6379> incrby orderId 1000
(integer) 2002
127.0.0.1:6379>