Redis从入门到精通(6):redis的string数据类型详解

我们可以把任何内容,例如一张图片一首歌,转换成二进制字符串保存在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里面则不能投票,否则可以正常投票。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值