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是否过期,如果不过期就给予友好提示。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,665评论 19 139
  • NOSQL类型简介键值对:会使用到一个哈希表,表中有一个特定的键和一个指针指向特定的数据,如redis,volde...
    MicoCube阅读 4,164评论 2 27
  • 本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍。之后概...
    kelgon阅读 61,670评论 23 625
  • 1 Redis介绍1.1 什么是NoSql为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方...
    克鲁德李阅读 5,730评论 0 36
  • 知乎上有一个问题,如果你去到某个城市,作为东道主如何带你认识这个城市。我不算石家庄土著,来这里短短六年时间,在这里...
    石门吹雪阅读 493评论 1 4

友情链接更多精彩内容