Redis的String类型

177 阅读4分钟

Redis的value一共有5种,最基础的当然是string了,今天就来聊聊Redis的String类型。

一、表示字符串

当用String类型操作字符串时,用法如下:

1、set key value(e.g:set k1 hello)
2、get key(e.g:get k1)
3、set key value nx,SETNX key value(设置的key不存在时才能把value设置到key上)。使用场景:分布式锁
4、set key value xx(设置的key存在时才会把key的值修改为value的值)。
5、mset(设置多个key-value)
6、msetnx key1 value1 key2 value2...(当所有的key为空时才会设置成功,原子性操作)
7、mget(得到多个key的value)
8、append key value(在此key后追加value)
9、getrange key start end(取该key start到end之间的值)。e.g:getrange k1 6 10
正反向索引 getrange k1 0 -1。
10、setrange key offset value(覆盖key指定偏移量后的值为value)
11、strlen key(取key长度)
12、getset key value(设置此key的value为新输入的值,同时返回老的值),把一次get和一次set两次IO的请求变为一次

type key(查看此key对应value的类型):客户端调用时,不用取到value就可以知道value的类型;即在做一些计算时,如果类型不匹配直接就返回,而不用取value的值。

object encoding key:查看此key对应value的编码,减少类型转化的过程,提高速度

二、表示数值

当用String类型操作数值时,用法如下:

1、incr key(给key加1)
2、incrby key 22(给key加22)
3、decr key(给key减1)
4、decrby key 22(给key减22)
5、incrbyfloat key 0.5(给key加0.5)

数值使用场景:秒杀、点赞、评论(可以规避并发下,对数据库的事务操作,完全由Redis内存操作代替)

二进制安全:Redis进程与外界交互时,Redis只从客户端取出字节,并不按照某一个编码转化,也就是client有统一的编解码,数据就不会被破坏。

客户端访问Redis时,Redis只返回字节流,存储字节

例如:

set k2 中
strlen k2 (值为3) < 当xshell连接时用的是utf-8编码 >。
set k2 中
strlen k2 (值为2) < 当xshell连接时用的是gbk编码 >。
redis-cli --raw(格式化进入客户端),也就是不带--raw时,Redis只会识别ASCII类型,带了--raw会触发编码集的格式化(即会以当前xshell连接时使用的编码进行格式化)。

三、bitmap

当使用String类型操作二进制位时用法如下:

image.png

1、setbit key offset value(offset是二进制位的偏移量):设置key的offset位置上的值为value。
e.g: setbit k1 1 1,strlen k1为1,get k1为@; setbit k1 7 1,strlen k1为1,get k1为A; setbit k1 9 1,strlen k1 为2,get k1为A@。(可以使用man ascii查看)

2、bitpos key bit start end(查找指定bit<二进制位0或1>在start到end<字节索引>之间第一次出现的位置<二进制位的位置>)。
e.g:bitpos k1 1 0 0(查找k1第一个字节中<0到0>第一次出现1的位置)。

3、bitcount key start end(统计key在start到end之间1出现的次数)。
e.g:bitcount k1 0 1。

4、bitop operation destkey key1 key2 ...(将key1,key2...取出按operation做按位运算,结果赋值给destkey)。
e.g: setbit k1 1 1
setbit k1 7 1 (k1为A)
setbit k2 1 1
setbit k2 6 1 (k2为B)
bitop and andkey k1 k2(k1与k2做按位与运算,结果给andkey)

例子1:有一个用户系统,统计用户登录天数,且日期随机,如何实现?

setbit my 1 1(第二天登录)
setbit my 7 1(第八天登录)
setbit my 364 1
strlen my
bitcount my -2 -1(最后16天登录次数)

节省空间,操作速度快

例子2:某东618做活动,送礼物,需要备货多少礼物,假设有2亿用户,难道每人一份?

首先肯定不是每人一份,你得区分出僵尸用户、冷热用户。也就是活跃用户统计!

比如说1号--3号登录数,连续登录要去重

setbit 20190101 1 1(表示20190101这天id为1的用户登录了)
setbit 20190102 1 1(表示20190102这天id为1的用户登录了)
setbit 20190102 7 1(表示20190102这天id为7的用户登录了)
bitop or destkey 20190101 20190102(通过或运算将1号和2号登录用户去重)
bitcount destkey 0 -1(统计总共有多少用户登录)

本文列举了一些Redis String类型的常见用法,对于其他用法,可以在输入redis-cli进入客户端后,输入help @string,查看string组的所有帮助信息