特点:
- 字符串类型是二进制安全的(在传输数据的时候,能保证二进制数据的信息安全,也就是不会被篡改、破译;如果被攻击,能够及时检测出来),它们都有一个已知的长度,可以接受任何格式的数据(如信息交换中常用的JSON格式字符串,甚至图像数据),value除了是我们的字符串还可以是数字
- 字符串类型最多可以容纳长度可达512M
应用场景:
- 计数器: 如文章阅读数、粉丝数。incr本身就是具有原子性特性,所以不会有线程安全的问题
- 验证码:通过设置key的过期时间来销毁过期的验证码,和业务系统解耦
- 存储对象:如用户基本信息json{“id”:”1″,”username”:”name”}
- bitmap位图: 如签到,打卡等场景统计
- 分布式锁:用过string类型的setnx命令“当key不存在时,设置并返回1,当key已存在时,不设置并返回0”, “判断key是否存在”和“设值“两个操作是原子性地执行的,因此可以用string类型作为分布式锁,返回1表示获得锁,返回0表示没有获得锁。
- 统计多单位的数量 udi:2222:follow
- 粉丝数
- 对象缓存
String类型命令的官方文档:
https://redis.io/commands/?group=string
1. set, get
set key value [ex 秒数] [px 毫秒数] [nx/xx]
ex: 指定到期时间,单位秒
px: 指定到期时间,单位毫秒,如果ex,px同时写,则以后面的有效期为准
nx: 对应key不存在则创建
xx: 对应key存在则修改其值
#get命令用来获取指定键的值,如果键不存在,返回nil, 如果返回值不是字符串,则返回错误
get key
示例
127.0.0.1:6379> set name bianpj
OK
127.0.0.1:6379> get name
"bianpj"
127.0.0.1:6379> get nname
(nil)
2. mset,mget命令
mset key1 value1 key2 value2 … #一次性设置多个键和值
mget key1 key2 … # 返回所有给定键的值,对于某个不存在值的键或不存在的键,返回nil,否则返回键的值列表
127.0.0.1:6379> mset name1 bian name2 pei name3 jiang
OK
127.0.0.1:6379> mget name1 name2 name3 name4
1) "bian"
2) "pei"
3) "jiang"
4) (nil)
3. setrange,getrange命令
setrange key offset value
#将字符串中偏移量为offset后的子串覆盖为指定的值,该命令返回修改后的字符串的长度
#如果偏移量offset > 原字符串长度,不足部分用0x00补全
getrange key start stop
#获取字符串指定范围的子串
#支持负偏移量,右边第一个下标为-1
# 假设字符串长度为length, getrange根据以下原则决定返回值
# 当start > length, 则返回空字符串
# 当stop >= length, 则截取至字符串尾
# 如果start > stop, 则返回空字符串
# 如果0<= start <= stop < length 返回指定范围子串
127.0.0.1:6379> set key1 "Hello World"
OK
127.0.0.1:6379> setrange key1 6 "redis"
(integer) 11
127.0.0.1:6379> get key1
"Hello redis"
127.0.0.1:6379> setrange key1 15 "Hei"
(integer) 18
127.0.0.1:6379> get key1
"Hello redis\x00\x00\x00\x00Hei"
127.0.0.1:6379> set key1 "This is getrange testing"
OK
127.0.0.1:6379> getrange key1 5 6
"is"
127.0.0.1:6379> getrange key1 100 200
""
127.0.0.1:6379> getrange key1 5 100
"is getrange testing"
4. setex, setnx
# 设置key的值,并指定过期时间(单位:秒)
setex key seconds value
# 设置key的值,如果存在则不重新设置,返回0,否则返回1
setnx key value
127.0.0.1:6379> setex key1 5 "hello"
OK
127.0.0.1:6379> get key1
"hello"
127.0.0.1:6379> get key1
(nil)
127.0.0.1:6379> setnx key1 "hello"
(integer) 1
127.0.0.1:6379> setnx key1 "world"
(integer) 0
127.0.0.1:6379> get key1
"hello"
10.. incr、incrby、incrbyfloat、decr、decrby命令
incr key
# 自增一个指定键对应的整数值并返回新的值
# 如果该键不存在,则创建键,对应的value被设置为0然后执行自增操作
# 如果该键对应的值不能转换为整数,返回错误
incrby key k
# 可以自定义自增值
incrbyfloat by f
# 自定义自增一个浮点数
decr key
# 自减1
decrby key decrement
# 自减指定值
127.0.0.1:6379> set key1 10
OK
127.0.0.1:6379> incr key1
(integer) 11
127.0.0.1:6379> incr key2
(integer) 1
127.0.0.1:6379> set key2 "non"
OK
127.0.0.1:6379> incr key2
(error) ERR value is not an integer or out of range
127.0.0.1:6379>
127.0.0.1:6379> incrby key1 5
(integer) 16
127.0.0.1:6379> get key1
"16"
127.0.0.1:6379>
127.0.0.1:6379> incrbyfloat key1 0.5
"16.5"
127.0.0.1:6379> get key1
"16.5"
127.0.0.1:6379> decr key1
(error) ERR value is not an integer or out of range
127.0.0.1:6379> get key1
"16.5"
127.0.0.1:6379> set key2 10
OK
127.0.0.1:6379> decr key2
(integer) 9
127.0.0.1:6379> decrby key2 3
(integer) 6
127.0.0.1:6379> get key2
"6"
11. strlen
strlen key
# 返回指定键的字符串值的长度
127.0.0.1:6379> keys *
1) "key2"
2) "hello"
3) "name2"
4) "name1"
5) "name"
6) "name3"
7) "key1"
127.0.0.1:6379> strlen hello
(integer) 5
127.0.0.1:6379> strlen name2
(integer) 3
12 . append
append key value
#将字符串追加到指定key的原值末尾,返回新字符串的长度
127.0.0.1:6379> set key1 "Hello"
OK
127.0.0.1:6379> append key1 "World"
(integer) 10
127.0.0.1:6379> get key1
"HelloWorld"
12. setbit, getbit命令
setbit key offset value
# 设置指定键的字符串在offset偏移量上对应二进制位上的值,并返回该位上的旧值。
# 由于操作的是二进制位,所以设置新值只能为0或1
# 如果指定key不存在,则创建一个新值并在指定的offset上设置二进制值。
# 如果offset大于字符串的长度,不足部分用0填充后在指定offset上设置二进制值
getbit key offset
# 返回指定偏移量offset上二进制位的值。
# 如果offset大于value的长度,或指定key不存在,则返回0
127.0.0.1:6379> get key1
"HelloWorld"
127.0.0.1:6379> setbit key1 7 1
(integer) 0
127.0.0.1:6379> get key1
"IelloWorld"
127.0.0.1:6379> setbit key1 8 2
(error) ERR bit is not an integer or out of range
127.0.0.1:6379> getbit key1
(error) ERR wrong number of arguments for 'getbit' command
127.0.0.1:6379> getbit key1 7
(integer) 1
127.0.0.1:6379> getbit key1 8
(integer) 0
127.0.0.1:6379> getbit key1 100000
(integer) 0
127.0.0.1:6379> set key1 v1
127.0.0.1:6379> get key1
127.0.0.1:6379> keys *
127.0.0.1:6379> EXISTS key1
127.0.0.1:6379> APPEND key1 "hello" //追加字符串,如果当前key不存在,就相当于set
127.0.0.1:6379> get key1
127.0.0.1:6379> STRLEN key1 //获取字符串长度
127.0.0.1:6379> APPEND key1 "aaaabb"
127.0.0.1:6379> get key1
//自增自减
127.0.0.1:6379> set views 0
127.0.0.1:6379> get views
127.0.0.1:6379> incr views //自增1
127.0.0.1:6379> incr views
127.0.0.1:6379> get views
127.0.0.1:6379> decr views //自减1
127.0.0.1:6379> incrby views 10 //自增10
127.0.0.1:6379> decrby view 10 //自减10 可以指定增量
//字符串范围 range
127.0.0.1:6379> set key1 "hello, kuangshen"
127.0.0.1:6379> get key1
127.0.0.1:6379> getrange key1 0 3 //截取字符串[0,3]
127.0.0.1:6379> getrange key1 0 -1 //获取全部的字符串和get key是一样的
//替换
127.0.0.1:6379> set key2 abcdefg
127.0.0.1:6379> get key2
127.0.0.1:6379> setrange key2 1 xx //替换指定位置的字符串
127.0.0.1:6379> get key2
//setex (set with expire) #设置过期时间
//setnx (set if exists) #不存在设置(在分布式锁中会常常使用@)
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 //同时设置多个值
OK
127.0.0.1:6379> mget k1 k2 k3 //同时获取多个值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4 //msetnx 是一个原子性的操作,要么一起成功,要么一起失败
(integer) 0
127.0.0.1:6379> get k4
(nil)
// 对象
set user:1 {name:zhangsan, age:18} //设置一个user:1对象 值为json字符串
//这里的key是一个巧妙的设计: user:{id}:{field} 如此设计在redis中是完全ok的
getset //先get后set