您当前的位置: 首页 >  数据结构

陈橙橙丶

暂无认证

  • 2浏览

    0关注

    107博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Redis专题(二):核心数据结构以及应用场景(String:你真的会使用类型吗)

陈橙橙丶 发布时间:2021-05-28 17:10:00 ,浏览量:2

本系列会持续输出Redis相关的知识整理,提升自己的同时希望能帮助到有需要的朋友,持续输出…持续输出…持续输出…

目录传送

本篇文章会简单整理一下Redis核心数据结构和基本使用。

数据结构种类

在这里插入图片描述

字符串String

字符串常用操作

//存入字符串键值对 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>
关注
打赏
1648473527
查看更多评论
立即登录/注册

微信扫码登录

0.0374s