Redis学习笔记-03String字符串
2020-12-23 本文已影响0人
惊天动地猪儿虫
Redis有以下几种数据类型,这里从String字符串来开始。
- 字符串类型
- 散列类型 Map Dictinary
- 列表类型 ArrayList List
- 集合类型 HashSet
- 有序集合类型 SortDictionary skipList CURD(logN)
1 介绍
字符串是Redis中最基本的数据类型,能存储字符串,包括二进制数据。一个键对应的值,最大是512MB。而且字符串是其他4种数据类型的基础,其他数据类型都是在从不同的角度来组织字符串。
String是一个Key对应一个Value,String类型是二进制安全的。Redis的String可以包含任何数据,比如jps图片或者序列化的对象。
2 命令操作
以下是字符串类型常用的几种操作命令。
API方法名 | 作用 |
---|---|
set | 设置key对应的值为string类型的value |
setnx | 设置key对应的值为string类型的value,如果key已经存在,返回0,nx是not exist的意思。 |
setex | 设置key对应的职位String类型的value,并指定此键值对应的有效期【秒】。 |
setrange | 设置指定key的value值的子字符串 |
mset | 一次设置多个key的值,成功返回OK表示所有的值都设置了, 失败返回0表示没有任何职被设置。 |
msetnx | 一次性设置多个key的值,成功返回ok表示所有的值都设置了,失败返回0表示没有任何值被设置,但是不会覆盖已经存在的key。 |
get | 获取key对应的string值,如果可以不存在返回nil |
getset | 设置key的值,并返回key的旧值 |
getrange | 获取key的value值的子字符串 |
mget | 一次获取多个key的值,如果对应key不存在则对应返回nil |
incr | 对key的值做加加操作(自增),并返回新的值。 |
incrby | 同incr类似,加指定值,key不存在时候回设置key,并认为原来的value是0。 |
decr | 对key的值做减减操作 |
decrby | 同decr类似,减指定值 |
append | 给指定key的字符串追加value,返回新字符串的长度 |
strlen | 取指定key的value值的长度 |
2.1 set和get
127.0.0.1:6378> set name hello
OK
127.0.0.1:6378> set passwd world
OK
127.0.0.1:6378> get name
"hello"
127.0.0.1:6378> get passwd
"world"
127.0.0.1:6378> setnx name hello1
(integer) 0
127.0.0.1:6378> get name
"hello"
127.0.0.1:6378>
127.0.0.1:6378> setex name1 10 hello # 设置为10s
OK
127.0.0.1:6378> get name1 #10秒内
"hello"
127.0.0.1:6378> get name1 #10秒外
(nil)
127.0.0.1:6378>
2.2 incr
原子性递增,可以用来生成订单号。
127.0.0.1:6378> set nums 1000
OK
127.0.0.1:6378> incr nums
(integer) 1001
127.0.0.1:6378> incr nums
(integer) 1002
127.0.0.1:6378> incr nums
(integer) 1003
127.0.0.1:6378> incrby nums 2000
(integer) 3003
127.0.0.1:6378>
2.3 decr
原子递减
127.0.0.1:6378> set num1 1000
OK
127.0.0.1:6378> decr num1
(integer) 999
127.0.0.1:6378> decr num1
(integer) 998
127.0.0.1:6378> decrby num1 500
(integer) 498
127.0.0.1:6378>
2.4 append
127.0.0.1:6378> get name
"hello"
127.0.0.1:6378> append name " world" # 注意append第二个参数,添加双引号的区别
(integer) 11
127.0.0.1:6378> get name
"hello world"
127.0.0.1:6378>
127.0.0.1:6378> set name my
OK
127.0.0.1:6378> get name
"my"
127.0.0.1:6378> append name World #注意append第二个参数,不添加双引号的区别
(integer) 7
127.0.0.1:6378> get name
"myWorld"
127.0.0.1:6378>
3 位操作
一个字节有8个二进制位组成,Redis提供了4个命令可以直接对二进制位进行操作。
3.1 GETBIT key offset
获取二进制中offset这个位置的“0,1”状态。
[root@master ~]# redis-cli -p 6378
127.0.0.1:6378> set num1 2
OK
127.0.0.1:6378> getbit num1 0
(integer) 0
127.0.0.1:6378> getbit num1 1
(integer) 0
127.0.0.1:6378> getbit num1 2
(integer) 1
127.0.0.1:6378> getbit num1 3
(integer) 1
127.0.0.1:6378> getbit num1 4
(integer) 0
127.0.0.1:6378> getbit num1 5
(integer) 0
127.0.0.1:6378> getbit num1 6
(integer) 1
127.0.0.1:6378> getbit num1 7
(integer) 0
127.0.0.1:6378>
# 这里二进制是从0~7 高位到低位
解释:2 在Redis中以字符串2存储,根据ASCII码表,二进制表示为0 0 1 1 0 0 1 0
。
其过程如下:2=> '2' => 50 => 0 0 1 1 0 0 1 0 32+16+2
3.2 SETBIT key offset value
设置二进制中offset这个位置的“0,1”状态。
127.0.0.1:6378> setbit num1 7 1
(integer) 0
127.0.0.1:6378> get num1
"3"
127.0.0.1:6378>
解释:修改二进制的第8位为1。其过程表示如下:
0 0 1 1 0 0 1 0 => 0 0 1 1 0 0 1 1 => 32+16+2+1 => 51 ('3')
3.3 BITCOUNT key [start] [end]
获取二进制中1的个数。
127.0.0.1:6378> bitcount num1
(integer) 3
127.0.0.1:6378>
3.4 BITOP operstion destkey key [key...]
二进制位的操作(^ & |)
127.0.0.1:6378> set num1 3
OK
127.0.0.1:6378> set num2 2
OK
127.0.0.1:6378> bitop and num3 num1 num2
(integer) 1
127.0.0.1:6378> get num3
"2"
127.0.0.1:6378>
解释 num1 & num2 根据下面的规则运算结果为 2
0 0 1 1 0 0 1 1 num1 = 3
& 0 0 1 1 0 0 1 0 num2 = 2
__________________________
0 0 1 1 0 0 1 0 num3= 2
Redis中的二进制注意点:
-
你所输入的数字全部用char类型表示,比如 2 就是以 ascii码存储的,即为【50】
2的ASCII码
参考如下ASCII码表
ASCII码中2的二进制表示为 0011 0010 而非 0000 0010。 -
一般来说2这个字符的二进制位,采用的顺序是(从右到左。)但是在redis是从(从左到右)
如上图所示