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

本文介绍了Redis中的核心数据结构——字符串String的使用,包括存取、原子加减、分布式锁和计数器场景。通过示例展示了如何利用String进行单值缓存、对象缓存以及实现简单的分布式锁和计数器功能。推荐使用MGET进行对象缓存,利用INCRBY批量生成序列ID以减少Redis交互次数,提高性能。
摘要由CSDN通过智能技术生成

本系列会持续输出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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈橙橙丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值