redis字符串类型详解及应用场景分析

常用命令

设置值

set key value [ex seconds] [px milliseconds] [nx|xx]

选项说明: ex seconds 设置秒级过期时间 px milliseconds 设置毫秒级过期时间 nx 键不存在时才设置成功,用于添加 xx 键存在时才设置成功,用于更新

除了set选项,redis还提供了setnx,作用与nx选项相同

127.0.0.1:6379> exists hello
(integer) 0
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> setnx hello redis
(integer) 0
127.0.0.1:6379> set hello redis xx
OK
127.0.0.1:6379> get hello
"redis"

获取值

get key

键不存在返回nil

127.0.0.1:6379> get hello
"redis"
127.0.0.1:6379> get test
(nil)

批量设置与获取值

mset key value [key value ...] mget key [key ...]

127.0.0.1:6379> mset a 1 b 2 c 3 d 4
OK
127.0.0.1:6379> mget a b c d
1) "1"
2) "2"
3) "3"
4) "4"

批量操作命令可以有效提高效率,减少因为多条命令执行而产生的网络传输时间

计数

incr key incr命令用于对值做自增操作,结果分为: 值不是整数,返回错误 值是整数,返回自增后的结果 键不存在,按照值为0自增,返回结果为1

127.0.0.1:6379> exists num
(integer) 0
127.0.0.1:6379> incr num
(integer) 1
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> incr hello
(error) ERR value is not an integer or out of range

除了incr,redis还提供了decr(自减), incrby(自增指定数字), decrby(自减指定数字), incrbyfloat(自增浮点数)

decr key incrby key increment decrby key decrement incrbyfloat key increment

其他指令

追加值

append key value

127.0.0.1:6379> get name
"redis"
127.0.0.1:6379> append name course
(integer) 11
127.0.0.1:6379> get name
"rediscourse"

字符串长度

strlenkey 每个中文占3个字节

127.0.0.1:6379> set hello '世界'
OK
127.0.0.1:6379> strlen hello
(integer) 6
127.0.0.1:6379> get name
"rediscourse"
127.0.0.1:6379> strlen name
(integer) 11

设置新值并返回原始值

getset key value

127.0.0.1:6379> del hello
(integer) 1
127.0.0.1:6379> getset hello world
(nil)
127.0.0.1:6379> getset hello redis
"world"

设置指定位置的字符

setrange key offset value

127.0.0.1:6379> set redis pest
OK
127.0.0.1:6379> setrange redis 0 b
(integer) 4
127.0.0.1:6379> get redis
"best"

获取部分字符串

getrange key start end

127.0.0.1:6379> getrange redis 0 1
"be"

时间复杂度有

字符串相关指令的时间复杂度

image.png

应用场景

缓存功能

典型的使用:mysql作为存储层,redis作为缓存层,用户获取数据首先从缓存层获取,如果缓存失效或者不命中,再去mysql获取数据,并更新redis缓存。这样绝大部分的数据都是从redis获取,能有效地降低mysql的压力

redis键名设置规范:推荐用"业务名:对象名:id:[属性]"作为键名。 如mysql的数据库名为vs,用户表名为user,那么对应的键可以用"vs:user:1:name"来表示 在能描述键含义的前提下适应减少键的长度,减少由于键过长的内存浪费

共享session

分布式的web服务将用户的session信息保存在各自的服务器,在负载均衡的分发下,用户在访问页面时会请求到不同的服务器上,由于session不一致,用户的登录信息不能同步,导致用户需要重新登录。 解决方案:将用户的session统一存入redis进入集中管理

限速

为了防止用户频繁地进行某些操作,可能通过redis的过期时间对用户行为进行限制。如限制用户每隔3秒才能进行一次搜索,当用户发起搜索后,就将key设置过期时间为3秒,再次请求时检查key是否过期,如果不过期就给予友好提示。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

3000 字 Flask 快速学习指南:从入门到开发

作者:过了即是客 Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务。本文参考自Flask官方文档,...

4499
来自专栏乐百川的学习频道

Flask 快速入门

Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务。本文参考自Flask官方文档,大部分代码引用自官方...

2389
来自专栏从零开始学自动化测试

python文档23-fixture作为参数传入,error和failed区别

fixture是pytest的核心功能,也是亮点功能,熟练掌握fixture的使用方法,pytest用起来才会得心应手!

884
来自专栏九彩拼盘的叨叨叨

写出好的前端代码不是件容易事

什么样的代码算是好代码? 在我看来,易于维护的代码就是好代码。当然代码还可以从性能,安全等方面来考量。这些不在本文的讨论范围之内。

643
来自专栏大内老A

ASP.NET Core应用针对静态文件请求的处理[4]: DirectoryBrowserMiddleware中间件如何呈现目录结构

和StaticFileMiddleware中间件一样,DirectoryBrowserMiddleware中间本质上还是定义了一个请求地址与某个物理目录之间的映...

1817
来自专栏阮一峰的网络日志

Javascript文件加载:LABjs和RequireJS

传统上,加载Javascript文件都是使用<script>标签。 就像下面这样:   <script type="text/javascript" src=...

3224
来自专栏IT可乐

JS 中 cookie 的使用

1、cookie 是什么?   ①、cookie 是存储于访问者计算机中的变量。每当一台计算机通过浏览器来访问某个页面时,那么就可以通过 JavaScript ...

1807
来自专栏ytkah

群用户通过微信小程序可以更好地协作了

  今天,小程序向开发者开放了群ID的接口能力。简单地说,就是当你把小程序分享在群聊中,被点击后开发者可获取群ID和群名称,也方便更好地针对群场景提供个性化服务...

3475
来自专栏java思维导图

Java 9 新特性,看这里就明白了

摘要: 1.目录结构 2.repl工具 jShell命令 3.模块化 4.多版本兼容jar包 5.接口方法的改进(在接口中 jdk7 只能声明全名常量...

2946
来自专栏逢魔安全实验室

隐藏在Chrome插件商店中的恶魔——恶意插件User-Agent Swither分析

? ? 0x00 插件背景 — User-Agent Swither 是一款Chrome插件,用户切换访问web时候的User-Agent的,这个插件有51万...

3275

扫码关注云+社区