一、String 类型
1、String 是 Redis 最基本的类型,可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value;
2、String 类型是二进制安全的。意味着 Redis 的 String 可以包含任何数据,比如 jpg 图片或者序列化的对象;
3、String 类型是 Redis 最基本的数据类型,一个 Redis 中字符串 value 最多可以是 512 M;
二、常用操作
get <key> |
查询对应键值
|
set <key> <value>
|
添加键值对
|
append <key> <value>
|
将给定的 <value> 追加到原值的末尾
|
strlen <key>
|
获取值的长度
|
setnx <key> <value>
|
只有在key不存在时设置key的值,key存在时,不进行修改
|
incr <key>
|
将key中存储的数字值增1; 只能对数字值操作,如果为空,新增值为1 |
decr <key>
|
将key中存储的数字值减1;
只能对数字之操作,如果为空,新增值为 -1
|
incrby / decrby <key> 步长
|
将 key 中存储的数字值增减,自定义步长
|
mset <key1> <value1> <key2> <value2> |
同时设置一个或多个 key-value 对
|
mget <key1> <key2> <key3>
|
同时获取一个或多个 value
|
msetnx <key1><value1><key2><value2>
|
同时设置一个或多个key-value对,当且仅当所有给定的key都不存在
|
getrange <key><起始位置><结束位置>
|
获取值的范围,类似java中的substring
|
setrange <key> <起始位置> <value>
|
用<value>覆盖<key>所存储的字符串值,从<起始位置>开始
|
setex <key> <过期时间> <value>
|
设置键值的同时,设置过期时间,单位秒
|
getset <key> <value>
|
以新换旧,设置了新值的同时获取旧值
|
三、详说 incr key 操作的原子性
1、所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch(切换到另一个线程)。
2、在单线程中,能够在单条指令中完成的操作都可以认为是“原子操作”,因为中断只能发生于指令之间;
3、在多线程中,不能被其他进行(线程)打断的操作就叫原子操作;
4、Redis 单命令的原子性主要得益于 Redis 的单线程
5、思考:java 中的 i++ 是否是原子操作?
不是原子操作:
i++:可以拆分为三步:
1、读内存到寄存器
2、在寄存器中自增
3、写会内存中