- 字符串是redis最基础的数据结构,字符串类型的值实际可以是:
- 简单字符串,复杂字符串(json,xml),数字(整数,浮点数),二进制(图片,音频,视频)但是不能超过512mb
一、字符串常用命令:
1.1、设置值:set
- 语法:set key value [ ex seconds ] [ px milliseconds ] [ nx | xx ]
- 返回值:ok代表设置成功
- ex seconds:为键设置秒级过期时间
- px milliseconds:为键设置毫秒级过期时间
- nx:键必须不存在才设置成功,用于添加
- xx:与nx相反,键必须存在才可以设置成功,用于更新
1.2、setex,setnx:
- 语法:setex key seconds value
- 语法:setnx key value
127.0.0.1:6379> exists hello //hello这个不存在
(integer) 0
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> setnx hello redis //因为key不存在直接sentnx失败
(integer) 0
127.0.0.1:6379> set hello jedis xx //key存在可以直接set xx
OK
127.0.0.1:6379> get hello
"jedis"
127.0.0.1:6379>
setnx和setxx的应用场景:
- 由于redis的单线程处理机制,如果有多个客户端同时在线 setnx key value,根据setnx的特性只有一个客户端能设置成功,setnx可以作为分布式锁的一种实现方案。
1.3、获取值:get
- 语法:get key
- 返回值:不存在的键返回nil(空)
1.3.1、批量设置,批量获取
- 语法(设置):mset key value [ key value … ]
- 语法(获取):mget key [ key … ]
返回值:如果有些键不存在,值位nil(空),结果按照传入顺序返回
特点:批量操作可以提高开发效率,如果没有mget这样的命令要执行n系get耗时为n次命令时间+1次网络时间。使用mget只是一次操作的时间
1.4、计数:incr
- 返回值:
- 不是整数:返回错误
- 值是整数:返回自增后的结果
- 键不存在:返回值为0自增,结果为1。
1.5、同类计数命令:decr(自减),incrby(自增指定数字),decrby(自减指定数字),incrbyfloat(自增浮点数)
- 语法:
incr:incr key-name
- 将键存储的值加1操作
decr: decr key-name
- 将键存储的值减1操作
incrby: incrby key-name amount
- 将键存储的值加上整数amount
decrby:decrby key-name amount
- 将键存储的值减去整数amount
incrbyfloat: incrbyfloat key-name amount
- 将键存储的值加上浮点数amount(在redis2.6以上的版本可用)
127.0.0.1:6379> set string-add 23 //给创建key
OK
127.0.0.1:6379> incr string-add //String自增和自减操作
(integer) 24
127.0.0.1:6379> decr string-add
(integer) 23
127.0.0.1:6379> incrby string-add 3 //String与整数加减操作
(integer) 26
127.0.0.1:6379> decrby string-add 10
(integer) 16
127.0.0.1:6379> incrbyfloat string-add 4.3 //String加浮点数操作
"20.3"
- 注意:当redis中操作了一个不存在的key,redis会将key设置当成0来操作
127.0.0.1:6379> get test1 //整数自增操作:默认将key设置为0
(nil)
127.0.0.1:6379> incr test1
(integer) 1
127.0.0.1:6379> get test1
"1"
127.0.0.1:6379> decr test2 //整数自减操作:默认将key设置为0
(integer) -1
127.0.0.1:6379> get test2
"-1"
127.0.0.1:6379> incrby test3 3 //整数加整数操作:默认将key设置为0
(integer) 3
127.0.0.1:6379> get test3
"3"
127.0.0.1:6379> decrby test4 4 //整数减整数操作:默认将key设置为0
(integer) -4
127.0.0.1:6379> get test4
"-4"
127.0.0.1:6379> incrbyfloat test5 2.3 //整数减浮点数操作:默认将key设置为0
"2.3"
127.0.0.1:6379> get test5
"2.3"
二、不常用命令:
2.1、追加值:append,可以向字符串尾部追加值
- 语法:append key value
127.0.0.1:6379> set key hskjfsahfdjk
OK
127.0.0.1:6379> append key test-data
(integer) 21
127.0.0.1:6379> get key
"hskjfsahfdjktest-data"
2.2、字符串长度:strlen
- 语法:strlen key
127.0.0.1:6379> get key
"hskjfsahfdjktest-data"
127.0.0.1:6379> strlen key
(integer) 21
127.0.0.1:6379> set leng "测试"
OK
127.0.0.1:6379> strlen leng //每个中文占用3个字节
(integer) 6
2.3、设置并返回原值:getset
- 语法:getset key value
- 说明:返回之前的值
127.0.0.1:6379> get key
"hskjfsahfdjktest-data"
127.0.0.1:6379> getset key getset-data
"hskjfsahfdjktest-data"
127.0.0.1:6379> get key
"getset-data"
2.4、设置指定位置的字符:setrange
- 语法:setrange key offeset value
127.0.0.1:6379> get key
"test-data"
127.0.0.1:6379> setrange key 3 d //将key中的第3个字符换成d(从0开始计算)
(integer) 9
127.0.0.1:6379> get key
"tesd-data"
2.5、获取部分字符串:ferange
- 语法:gerange key start end
- 说明:start和end分别是开始和结束的偏移量,便宜量从0开始计算
127.0.0.1:6379> get key
"tesd-data"
127.0.0.1:6379> getrange key 5 8 //获取key中第5到第8个字符(从0开始计算)
"data"
三、内部编码
- 字符串类型的内部编码有3种:
- int:8个字节的长整型
- embstr:小于等于39个字节的字符串
raw:大于39个字节的字符串
redis会根据当前值的类型和长度决定使用哪种内部编码实现,如:
127.0.0.1:6379> set ange 23y12783618
OK
127.0.0.1:6379> object encoding ange
"embstr"
127.0.0.1:6379> set key 123
OK
127.0.0.1:6379> object encoding key
"int"
四、字符串使用场景:
4.1、缓存功能:
- 说明:用户缓存数据读取,通过key从redis中读取用户数据,没有数据再从数据库中获取
public User getUserInfo(Long id){
String key = "user_info:"+id;
String value = redis.get(key);
if (value !=null){
//将value转换成User对象并返回
}else{
// TODO 从数据库中获取数据并返回
}
}
4.2、计数
- redis可以实现快速计数,查询缓存的功能,同时数据可以异步到其他数据源,用户每操作一次就会在redis中执行计数操作
long incrCount(Long id){
String key ="incr_count:"+id;
return redis.incr(key);
}
4.3、共享session
- 在负载均衡的情况下为了保证session在不同服务器上的数据同步,将session数据存放到redis中,这样就保证了每个服务器中获取到session数据都是一样的
4.4、限速
- 在短信验证时会对用户手机进行验证,限制用户当天不能超过5次
public boolean checkPhone(String phone){
String key ="msg_phone:"+phone;
String isHase = redis.set(key, 1,"EX 86400","NX");
if(isHase != null || reids.incr(key)<=5){
retuen true;
}else{
return false;
}
}