Redis命令——string

字符串类型是 Redis 最基础的数据类型,关于字符串需要特别注意:
1)Redis 中所有的键的类型都是字符串类型,而且其他几种数据结构也都是在字符串类似基础上构建的,例如列表和集合的元素类型是字符串类型
2)字符串类型的值实际可以是字符串,包含⼀般格式的字符串或者类似 JSON、XML 格式的字符串,数字。可以是整型或者浮点型,甚至是二进制流数据,例如图片、音频、视频等。不过⼀个字符串的最大值不能超过 512 MB

Redis 所有的 key 都是字符串,value 的类型是存在差异的

Redis 中的字符串,是直接按照二进制数据的方式存储(不会做任何的编码转换)

mysql 的默认字符集是 拉丁文,插入中文会失败

常见命令

1)set

将 string 类型的 value 设置到 key 中。若 key 存在则覆盖原来的值,之前的 key 设置的 ttl 也失效

set key value [expiration EX seconds | PX milliseconds] [NX | XX]

如果设置成功,返回 OK
如果由于 SET 指定了 NX 或者 XX 但条件不满足,SET 不会执行,并返回 (nil)

O(1)

setnx key value

当 key 不存在时,设置 key-value

返回 1 表示设置成功, 0 表示设置失败  O(1)

•  EX seconds⸺使⽤秒作为单位设置 key 的过期时间
PX milliseconds ⸺使⽤毫秒作为单位设置 key 的过期时间
NX ⸺只在 key 不存在时才进⾏设置,即如果 key 之前已经存在,设置不执行
XX ⸺只在 key 存在时才进⾏设置,即如果 key 之前不存在,设置不执行

flushall  可以删除 redis 上所有的键值对(相当于MySQL中的删库)

2)get 

只支持字符串类型的 value,如果类型不对,会报错

get key

获取 key 对应的 value,如果 key 不存在,返回 nil  O(1)

3)mset  mget

一次设置/获得多个 key 的值

mset key [key ...]  

返回值是OK  O(N) N是 key 的数量

mget key [key ...]  

返回值是对应的 value 列表  O(N) N是 key 的数量

批量操作可以减少网络时间,但执行时间过长会造成阻塞

4)incr  decr

将 key 对应的 string 表示得数字加一

如果 key 不存在,视 key 对应的 value 是 0 。若不是一个整形或超过64位有符号整形,则报错

incr key

返回 Integer 类型加一后的值  O(1)

incrby key decrement(可以是负数)

返回 Integer 类型加后的值  O(1)

decr key

decrby key decrement(可以是负数)

incrbyfloat key decrement(可以是负数)

由于 Redis 处理命令是单线程模型。多个客户端同时针对同一个 key 进行加减操作,不会引起“线程安全”问题

5)append

如果 key 存在并且是一个 string,将 value 加到原有 string 的后边。如果 key 不存在,等同于 set

append key value

返回加完后的 string 的长度(字节)  O(1)

Redis 的字符串,不会对字符编码做任何处理(Redis 只认识字节)

6)getrange  setrange

返回 key 对应的 string 子串(左闭右闭)负数表示倒数

超过范围的偏移量会尽量根据 string 的长度调整成正确的值

getrange key start end

返回 string 类型的子串  O(N)(N 字符串长度)

setrange key offset value

返回替换后的 string 的长度  O(N)(N 字符串长度)

setrange 对不存在的 key 操作,会把 offset 之前的内容填充成 0x00

7)strlen

获取 key 对应的 string 的长度。当 key 对应的 value 不是 string 时报错

strlen key

返回 string 的长度  O(1)

1)c++ 中,字符串的长度是以字节为单位

2)java 中,字符串的长度是以字符为单位

char 使用 unicode,一个汉字使用两个字节

string 使用 utf8,一个汉字使用三个字节

3)MySQL 中,varchar(N)  N的单位也是字符

编码方式

string 内部的编码方式有三种:

1. int               64位/8字节 的整数

2. embstr        压缩字符串,适用于比较短的字符串

3.raw              普通字符串,适用于比较长的字符串,只是单纯的持有字节数组

Redis 存储小数,本质上还是存储字符串(每次进行算术运算,需要先把字符串转成小数)

整数直接用 int 存储(c++  long long    Java  long

应用场景

1)缓存(Cache)

Redis 作为缓冲层,MySQL 作为存储层,绝大多数的数据都从 Redis 获取

Redis 具有支撑高并发的特性,缓存通常能加速读写和降低后端压力

应用服务器访问数据时,先查询 Redis 

如果 Redis 上数据存在,直接从 Redis 上读取数据交给服务器,不访问数据库

如果 Redis 上数据不存在,读取MySQl,把读取到的结果返回给应用服务器。同时,把这个数据写入到 Redis

Redis 这样的缓存,经常用来存储“热点”数据

但是上述的策略存在一个明显的问题:

随着时间的推移,会有越来越多的数据在 Redis 从上查询不到,从而从MySQL读取并写入到Redis,Redis 存储的数据会越来越多  ——>

1)把数据写给 Redis 的同时,给 key 设置一个过期时间

2)Redis 也在内存不足的时候,提供了淘汰策略

2)计数功能

Redis 并不擅长数据统计

Redis 记录数据的变化,以异步(并非一个请求就写一个数据)的方式将数据同步到其他数据源

3)共享会话

会话:客户端与服务器交互过程中,产生的一些专属于该客户端的中间状态的数据

⼀个分布式 Web 服务将用户的 Session 信息(例如用户登录信息)保存在各自服务器中,但这样会造成⼀个问题:出于负载均衡的考虑,分布式服务会将用户的访问请求均衡到不同的服务器上,并且通常无法保证用户每次请求都会被均衡到同⼀台服务器上,这样当用户刷新⼀次访问是可能会发现需要重新登录,这个问题是用户无法容忍的

为了解决这个问题,可以使用 Redis 将用户的 Session 信息进行集中管理。在这种模式下,只要保证 Redis 是高可用和可扩展性的,无论用户被均衡到哪台 Web 服务器上,都集中从Redis 中查询、更新 Session 信息

4)验证码

很多应用出于安全考虑,会在每次进行登录时,让用户输入手机号并且配合给手机发送验证码,
然后让用户再次输入收到的验证码并进行验证,从而确定是否是用户本⼈。为了短信接口不会频繁访问,会限制用户每分钟获取验证码的频率
业务是一个公司/产品,是如何解决一个/一系列问题的过程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值