String
1 简介
string
是redis最基本的类型,一个key
对应一个value
。
string
类型是二进制安全的。意思是redis
的string
可以包含任何数据。比如jpg图片或者序列化的对象
string
类型是Redis
最基本的数据类型,一个键最大能存储512MB
。
二进制安全特点:
二进制安全是指,在传输数据时,保证二进制数据的信息安全,也就是不被篡改、破译等,如果被攻击,能够及时检测出来
① 编码、解码发生在客户端完成,执行效率高
② 不需要频繁的编解码,不会出现乱码
2. String
命令
//赋值语法:
set key value
//Redis SET 命令用于设置给定 key 的值。如果 key 已经存储值, SET 就覆写旧值,且无视类型
//成功返回ok
stenx key value //解决分布式锁 方案之一
//只有在 key 不存在时设置 key 的值。Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值
mest key value [key value ...]
//同时设置一个或多个 key-value 对
//取值语法:
get KEY
//Redis GET命令用于获取指定 key 的值。
//如果 key 不存在,返回 nil
//如果key 储存的值不是字符串类型,返回一个错误
getrange key start end
//用于获取存储在指定 key 中字符串的子字符串。字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)
getbit key offset
//对 key 所储存的字符串值,获取指定偏移量上的位(bit)
mget key1 [key2..]
//获取所有(一个或多个)给定 key 的值
//GETSET语法:
getset KEY VALUE
//Getset 命令用于设置指定 key 的值,并返回 key 的旧值,当 key 不存在时,返回 nil
strlen key
//返回 key 所储存的字符串值的长度
//删除语法:
del KEY
//删除指定的KEY
//如果存在,返回1 失败返回0
//自增/自减:
incr KEY
//Incr 命令将 key 中储存的数字值增1。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作
//自增:
incrby KEY 增量值
//Incrby 命令将 key 中储存的数字加上指定的增量值
//自减:
decr KEY
//或
DECYBY KEY 减值
//decR 命令将 key 中储存的数字减1
//字符串拼接:
append KEY VALUE
//Append 命令用于为指定的 key 追加至未尾,如果不存在,为新建赋值
3. 单数据操作与多数据操作的选择之惑
在上面可以看到对于set之类的指令有 set key value
一次设置一个,也可以 mset key1 value1 key2 value2
一次设置多个,那对于多个数据的set操作我应该多次调用 set key value
还是 mset key1 value1 key2 value2
一次设置多个呢?
整个操作的时间实际上等于往返时间+执行时间
对于执行时间来说两个操作是一样的,而对于往返时间还由数据量决定,所以还需考虑数据量再做决定;
如果是10000条数据使用多指令操作,往返时间很长,而又因为操作是单线程所以会阻塞影响性能
如果是50条数据,则完全可以使用多指令
4. 应用场景:
redis
的所有操作都是原子性的,所有不会出现线程安全的问题
① String
通常用于保存单个字符串或JSON
字符串数据
② 因String
是二进制安全的,所以你完全可以把一个图片文件的内容作为字符串来存储
③ 计数器(常规key-value
缓存应用。常规计数: 微博数, 粉丝数)
INCR
等指令本身就具有原子操作的特性,所以我们完全可以利用redis
的INCR、INCRBY、DECR、DECRBY
等指令来实现原子计数的效果。
假如,在某种场景下有3个客户端同时读取了mynum
的值(值为2),然后对其同时进行了加1的操作,那么,最后mynum
的值一定是5。
不少网站都利用redis
的这个特性来实现业务上的统计计数需求
5. string
类型数据的扩展操作使用场景
① string
作为数值操作
问题
大型企业级应用中,分表操作是基本操作,使用多张表存储同类型数据,但是对应的主键 id 必须保证统一性 ,不能重复。Oracle
数据库具有 sequence
设定,可以解决该问题,但是 MySQL
数据库并不具有类似的机 制,那么如何解决?
解决方案
redis
用于控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性,此方案适用于所有数据库,且支持数据库集群
特点
string
在redis
内部存储默认就是一个字符串,当遇到增减类操作incr
,decr
时会转成数值型进行计算
redis
所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发 带来的数据影响。
注意:按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis 数值上限范围,将报错。9223372036854775807(java中long型数据最大值,Long.MAX_VALUE)
② 时效问题
问题
“最强女生”启动海选投票,只能通过微信投票,每个微信号每 4 小时只能投1票
解决方案
设置数据具有指定的生命周期, redis
控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作
setex key seconds value
psetex key milliseconds value
6. key
的命名规范
规范1
eg: user:id:3506728370:fans → 12210947
eg: user:id:3506728370:blogs → 6164
eg: user:id:3506728370:focuss → 83
规范2
在redis中以json格式存储
eg: user:id:3506728370 → {"id":3506728370,"name":"晚","fans":12210862,"blogs":6164, "focus":83}