String
1、概念
1、String是Redis最基本的数据类型(较常用),一个key对应一个value
2、String类型是二进制安全的,Redis的String可以包含任何数据
3、一个Redis中字符串value最多是512M
2、常用命令:
get < key> 查询对应键值
.
set < key> < value> 添加键值对
.
append < key> < value> 将给定的value追加到原值的末尾
.
strlen < key> 获取值的长度
.
setnx < key> < value> 只有在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> 同时获取一个或者多个value
.msetnx < key1> < value1> < key2> < value2> 同时设置一个或多个key-value对,当且仅当所有给定的key都不存在
.getrange < key> <起始位置> <结束位置> 获得值的范围,类似java中的 substring(包头包尾)
.setrange < key> <起始位置> < value> 用< value>覆盖< key>所存储的字符串值,从<起始位置>开始
.
setex < key> <过期时间> < value> 设置键值的同时,设置过去时间,单位秒
.
getset < key> < value> 以新换旧,设置了新值的同时获取旧值
值得注意的是:
set: 如果不存在key,则直接创建,如果存在,将key对应的value值覆盖掉
.
setnx:如果不存在key,则直接创建,如果存在对key进行操作,返回的结果是0,相当于false,创建不成功
例:
127.0.0.1:6379> set a 100
OK
127.0.0.1:6379> get a
100
127.0.0.1:6379> set name 李
OK
127.0.0.1:6379> append name 小龙 //追加在指定key的后面
9
127.0.0.1:6379> get name
李小龙
127.0.0.1:6379> strlen name
9
127.0.0.1:6379> incr a //自增
101
127.0.0.1:6379> decr a //自减
100
127.0.0.1:6379> setnx name 黄飞鸿 //若数据库存在name 则不会创建成功,可以防止数据库原来的key被覆盖
0
127.0.0.1:6379> setnx sex 男
1
127.0.0.1:6379> get sex
男
127.0.0.1:6379> msetnx i 200 o 300 //批量设置键值,但是若数据库里面存在则创建不成功
1
127.0.0.1:6379> mget i o
200
300
127.0.0.1:6379> mset hobby Kf hight 180 //批量设置key
OK
127.0.0.1:6379> mget hobby hight //批量获取key
Kf
180
127.0.0.1:6379> incrby a 30 //类似于 a + 30
130
127.0.0.1:6379> decrby a 30 //类似于 a - 30
100
127.0.0.1:6379> getrange a 0 -1 //-1可以理解为最后一位字符的下标
100
127.0.0.1:6379> setrange a 1 1
3
127.0.0.1:6379> get a
110
127.0.0.1:6379> setex l 10 测试setex //设置key的同时,指定时间
OK
3、incr key 操作的原子性
什么是原子性?
理解1:一个线程在执行的过程中,不会发生上下文的切换 上下文切换:是指 CPU 从一个进程或线程切换到另一个进程或线程。
.
理解2:所谓原子性,就是不被线程调度机制所打断,一旦开始,直到结束,中间不会有任何的线程切换
.
理解3:是指一个操作是不可中断的。即使是多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。
.
三个理解,都是同样的意思,看那种好理解一点
在单线程中, 能够在单条指令中完成的操作都可以认为是" 原子操作",因为中断只能发生于指令之间。
.
在多线程中,不能被其它进程(线程)打断的操作就叫原子操作。
.
⭐Redis单命令的原子性主要得益于Redis的单线程
Redis Incr 命令将 key 中储存的数字值增一,如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incr 操作。
.
模拟一个场景:一个新的网站想要记录每个用户,每天访问的次数
办法:将用户的 id 与当前的 时间 作为拼接以后作为 key 值(一定要是字符串),每次用户访问的时候将当前用户的key执行一次incr命令即可
.
Redis命令的原子性使得我们不用考虑并发问题,可以方便的利用原子性自增操作
意思就是说你的服务哪怕是多机器多进程的,incr也能保证每次返回的结果不会出现相同的值.
Redis incr 可以实现原子性的递增 适用场景:计数器,高并发生成订单号,秒杀类的业务逻辑。
因为incr是原子操作,在并发状态下是安全的;多线程的情况下,也只有一个线程可以对key进行更改,其他线程是更改不了的,你也可以理解为一个线程直接把这个key给领养了,当作自己的儿子,那自己儿子肯定就只能自己教呗!!!。
希望可以对您有帮助 (_)!!!