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 条评论
登录 后参与评论

相关文章

来自专栏学习力

《Java从入门到放弃》框架入门篇:Struts2的基本访问方式(二)

1594
来自专栏chenssy

【死磕Java并发】—–J.U.C之Condition

在没有Lock之前,我们使用synchronized来控制同步,配合Object的wait()、notify()系列方法可以实现等待/通知模式。在Java SE...

3344
来自专栏技巅

Glusterfs之rpc模块源码分析(中)之Glusterfs的rpc模块实现(2)

1475
来自专栏晓晨的专栏

IdentityServer Topics(2)- 定义资源

1053
来自专栏happyJared

Linux私房菜:文件目录权限那点事

共有十个位,注意到第一个字符为[-],表示文件;常见的还有d,代表目录(directory);l,表示连接档(link)

812
来自专栏我是攻城师

Solr配置maxBooleanClauses属性不生效原因分析

2256
来自专栏linux、Python学习

Shell的18条常用命令整理

Linux上的文件以.开头的文件被系统视为隐藏文件,仅用ls命令是看不到他们的,而用ls -a除了显示一般文件名外,连隐藏文件也会显示出来。

790
来自专栏蓝天

log4j日志文件路径设置

假设有如下标准化的目录结构: $HOME |-- log |-- conf |-- bin |-- lib |-- data jar包放在l...

993
来自专栏技巅

Glusterfs之rpc模块源码分析(中)之Glusterfs的rpc模块实现(3)

1854
来自专栏性能与架构

腾讯前端首屏优化案例

下面是对腾讯前端团队优化手Q一个页面案例的总结 优化目标页面:手Q群成员分布的页面 ? 左面是首屏,右面是下拉后到底部 这个页面中,可以划分成四个部份:活跃...

36110

扫码关注云+社区