我们可以把任何内容,例如一张图片一首歌,转换成二进制字符串保存在redis中,而不用担心内容的篡改造成的乱码问题。为什么redis的字符串类型这么厉害,首先得提一提一个概念,叫二进制安全
。
我是T型人小付,一位坚持终身学习的互联网从业者。喜欢我的博客欢迎在csdn上关注我,如果有问题欢迎在底下的评论区交流,谢谢。
二进制安全
一个二进制安全(Binary-Safe)的字符串是可以包含任何字符的字符串,所有字符会被原样保存,而不会进行任何特殊字符的转义。
举个例子进行说明,很多编程语言使用0x00
做为结束符号,而对于二进制安全的字符串来说,这个结束符号也会被原样保存下来,而不会被当作结束的标志。
正因为Redis的字符串是二进制安全的,所以可以把任何对象,例如图片,储存为Redis中的一个字符串。
string数据类型
- 存储单个数据,是最简单最常用的数据类型
- 一个存储空间保存一个数据
- 如果字符串全是数字,可以当作数字来操作,但是还是字符串的格式
常用命令
- set key value
给key赋值,如果已经有值则覆盖原值
27.0.0.1:6379> set a 123
OK
127.0.0.1:6379> type a
string
127.0.0.1:6379>
- get key
获取key对应的值。如果key不存在返回nil,如果值类型不为string返回错误。
- mset key1 value1 key2 value2 [key3 value3 …]
- mget key1 key2 [key3 …]
m代表multiple,一次操作多个key
127.0.0.1:6380> mset a 1 b 2 c 3
OK
127.0.0.1:6380> get a
"1"
127.0.0.1:6380> get b
"2"
127.0.0.1:6380> get c
"3"
127.0.0.1:6380> mget a b c
1) "1"
2) "2"
3) "3"
127.0.0.1:6380>
- append key value
在原先key的后面附上value的内容,如果原先内容不存在则创建
127.0.0.1:6380> set name james
OK
127.0.0.1:6380> append name rocks
(integer) 10
127.0.0.1:6380> get name
"jamesrocks"
127.0.0.1:6380>
如果要加空格,将空格和内容用双引号围起来
- setnx key value
如果key不存在则创建key并赋值,否则执行失败
127.0.0.1:6379> keys *
1) "temp"
2) "temp3"
3) "a"
4) "temp2"
127.0.0.1:6379> get a
"123"
127.0.0.1:6379> setnx a 234
(integer) 0
127.0.0.1:6379> get a
"123"
127.0.0.1:6379>
- getrange key start end
对字符串按照[start,end]进行截取,下标从0开始,end位是闭集。
127.0.0.1:6379> set slogan xiaofu666
OK
127.0.0.1:6379> get slogan
"xiaofu666"
127.0.0.1:6379> getrange slogan 0 5
"xiaofu"
127.0.0.1:6379>
- getset key value
获取key的值并赋一个新的值
27.0.0.1:6379> get slogan
"xiaofu666"
127.0.0.1:6379> getset slogan xiaofu555
"xiaofu666"
127.0.0.1:6379> get slogan
"xiaofu555"
127.0.0.1:6379>
- strlen key
获取key值的长度
127.0.0.1:6379> get slogan
"xiaofu555"
127.0.0.1:6379> strlen slogan
(integer) 9
127.0.0.1:6379>
- incr key/incrby key num
对key的值进行增1操作,或者指定增加的值。
127.0.0.1:6379> get blog:click
(nil)
127.0.0.1:6379> incrby blog:click 3
(integer) 3
127.0.0.1:6379> incrby blog:click 3
(integer) 6
127.0.0.1:6379> incr blog:click
(integer) 7
127.0.0.1:6379> incr blog:click
(integer) 8
127.0.0.1:6379>
如果key不存在会被创建并赋值0再操作,所以redis里面的计数器不需要初始化
127.0.0.1:6380> get a
(nil)
127.0.0.1:6380> incr a
(integer) 1
127.0.0.1:6380> get a
"1"
127.0.0.1:6380>
- incrbyfloat
如果要进行浮点型数据的计算要用这个命令
- decr key/decrby key num
和上面的增加相反,对key的值进行减小。
127.0.0.1:6379> decr blog:click
(integer) 7
127.0.0.1:6379> decr blog:click
(integer) 6
127.0.0.1:6379> decrby blog:click 10
(integer) -4
127.0.0.1:6379>
- setex key seconds value
- psetnx key milliseconds
创建key的时候设置过期时长
127.0.0.1:6380> setex temp 10 flower
OK
127.0.0.1:6380> get temp
"flower"
127.0.0.1:6380> ttl temp
(integer) 4
127.0.0.1:6380> get temp
"flower"
127.0.0.1:6380> get temp
(nil)
127.0.0.1:6380>
对于一个设置了过期时间的key,对key的值的改变不会影响ttl。这个特性可以很好的和计数器结合,计数器可以周期进行清除,因为不需要初始化所以操作很方便。
127.0.0.1:6380> setex a 15 1
OK
127.0.0.1:6380> incr a
(integer) 2
127.0.0.1:6380> ttl a
(integer) 9
127.0.0.1:6380> incr a
(integer) 3
127.0.0.1:6380> ttl a
(integer) 4
127.0.0.1:6380> get a
(nil)
127.0.0.1:6380>
应用场景
- string类型通常用于保存单个字符串或者json字符串数据
- 因为string是二进制安全的,也完全可以用来保存图片视频等资源
- 用来做计数器,例如微博粉丝数,文章点击数。因为redis中的
incr
,decr
等指令本身具有原子性的作用,所以不用担心同时操作的时候计数出错。
实际案例
海选投票,规定每个微信号每四小时只能投一次票。如何实现?
思路:投票计数场景,数字变化快访问频繁,用redis。涉及时效性的操作可以用key的过期来实现。每投一次票给目标数字加一,同时将用户的微信id记录在redis里面,4小时后过期。用户再投票的时候如果发现自己的微信id在redis里面则不能投票,否则可以正常投票。