【redis】String类型常用命令

string 类型

set和get命令

set完全体命令

SET key value [expiration EX seconds |PX millisecods] [NX|xx]

set key value ex 10
相当于
set key value
expire key 10

px 相当于 pexpire

  • NX:如果key不存在,才设置。如果key存在,则不设置(返回nil)
  • XX:如果key存在,才设置(相当于更新key的value)。如果key不存在,则不设置(返回nil)

如果key不存在,创建新的键值对。如果key存在,则是让新的value覆盖旧的value。可能会改变原来的数据类型,原来这个key的ttl(生存时间)也会失效。

FLUSHALL 可以把redis上所有的键值对都带走

127.0.0.1:6379> set key1 123
OK
127.0.0.1:6379> get key1
"123"
-- 设置过期时间
127.0.0.1:6379> set key2 123 ex 10
OK
127.0.0.1:6379> ttl key2
(integer) 5
127.0.0.1:6379> ttl key2
(integer) 4
127.0.0.1:6379> ttl key2
(integer) 2
127.0.0.1:6379> ttl key2
(integer) -2
-- NX:如果key不存在,才设置。如果key存在,则不设置(返回nil)
127.0.0.1:6379> set key1 123
OK
127.0.0.1:6379> set key2 123 NX
OK
127.0.0.1:6379> set key1 123 NX
(nil)
-- XX:如果key存在,才设置。如果key不存在,则不设置(返回nil)
127.0.0.1:6379> set key1 789 XX
OK
127.0.0.1:6379> get key1
"789"
127.0.0.1:6379> set key3 123 XX
(nil)
127.0.0.1:6379> exists key3
(integer) 0

GET命令和之前的没有差别。对于GET来说,只是支持,字符串类型的value。如果value是其他类型,使用GET获取就会出错。

GET key

127.0.0.1:6379> lpush key3 11 22 33
(integer) 3
127.0.0.1:6379> get key3
(error) WRONGTYPE Operation against a key holding the wrong kind of value

mset和mget

mset和mget:一次操作多组键值对.

MGET key [key …]

MSET key value [key value …]

时间复杂度:O(N)。此处的N不是整个redis服务器中所有key的数量。而只是当前命令中,给出的key
的数量。也可以认为O(1)

127.0.0.1:6379> mset key1 111 key2 222 key3 333
OK
127.0.0.1:6379> mget key1 key2 key3
1) "111"
2) "222"
3) "333"

setnx,setex,psetex

setnx:不存在才设置,存在则设置失败

setex:设置过期时间,单位s

psetex:设置过期时间,单位ms

-- setnx:不存在才设置,存在则设置失败
127.0.0.1:6379> setnx key1 111
(integer) 1
127.0.0.1:6379> setnx key1 222
(integer) 0
127.0.0.1:6379> get key1
"111"
-- setex:设置过期时间,单位s
127.0.0.1:6379> setex key 10 222
OK
127.0.0.1:6379> ttl key
(integer) 6
127.0.0.1:6379> ttl key
(integer) 4
127.0.0.1:6379> ttl key
(integer) 3
127.0.0.1:6379> ttl key
(integer) -2
-- psetex:设置过期时间,单位ms
127.0.0.1:6379> psetex key 5000 333
OK
127.0.0.1:6379> pttl key
(integer) 1922
127.0.0.1:6379> pttl key
(integer) 885
127.0.0.1:6379> pttl key
(integer) -2

针对set的一些常见用法,进行了缩写。之所以这样搞,就是为了让操作更符合人的直觉.(使用者的门槛就越低,要背的东西就越少)

incr,incrby

incr:针对value+1

INCR key:

此时 key对应的 value必须得是整数。

此操作的**返回值,就是+1之后的值。**表示的整数的范围是64位/8字节表示的整数。相当于C++中的long long或者Java中long。incr操作的key如果不存在,就会把这个key的value当做0来使用.

-- key对应的 value必须得是整数
127.0.0.1:6379> set key 10
OK
127.0.0.1:6379> incr key
(integer) 11
127.0.0.1:6379> get key
"11"
127.0.0.1:6379> set key2 hello
OK
127.0.0.1:6379> incr key2
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set key2 1.5
OK
127.0.0.1:6379> incr key2
(error) ERR value is not an integer or out of range
-- 表示的整数的范围是64位/8字节表示的整数。
127.0.0.1:6379> set key2 2222222222222222222222222222222222222222222222222222222222
OK
127.0.0.1:6379> incr key2
(error) ERR value is not an integer or out of range
-- key如果不存在,就会把这个key的value当做0来使用.
127.0.0.1:6379> incr key3
(integer) 1
127.0.0.1:6379> get key3
"1"

incrby:可以针对key对应的value进行+n操作。操作注意的事项和incr一样。

-- key对应的 value必须得是整数
127.0.0.1:6379> get key
"11"
127.0.0.1:6379> incrby key 10
(integer) 21
-- key如果不存在,就会把这个key的value当做0来使用.
127.0.0.1:6379> incrby key4 10
(integer) 10
127.0.0.1:6379> get key4
"10"
-- 可以加上一个负数
127.0.0.1:6379> incrby key4 -1
(integer) 9
127.0.0.1:6379> get key4
"9"

decr,decrby,incrbyfloat

decr把key对应的value进行-1操作。此时 key对应的 value必须得是整数。
key对应的value必须是整数,在64位的范围内,如果这个key对应的value不存在,则当做0来处理。
decr的运算结果,也是计算之后的值。

127.0.0.1:6379> get key
"21"
127.0.0.1:6379> decr key
(integer) 20
127.0.0.1:6379> set key2 hello
OK
-- 只能操作整数,其他类型会报错
127.0.0.1:6379> decr key2
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set key2 1.5
OK
127.0.0.1:6379> decr key2
(error) ERR value is not an integer or out of range
-- 如果这个key对应的value不存在,则当做0来处理。
127.0.0.1:6379> keys *
1) "key3"
2) "key4"
3) "key2"
4) "key"
127.0.0.1:6379> decr key5
(integer) -1
127.0.0.1:6379> get key5
"-1"

decrby 把 key 对应的 value 进行 -n 的操作

127.0.0.1:6379> get key
"20"
127.0.0.1:6379> decrby key 10
(integer) 10
127.0.0.1:6379> get key
"10"
127.0.0.1:6379> decrby key -10
(integer) 20

incrbyfloat 把key对应的value进行+ - 运算。运算的操作数可以是浮点数.虽然此处没有提供减法版本的命令,但是使用 redis 进行的计数操作,一般都是针对整数来进行的。只能用加上负数的形式来实现减法。

127.0.0.1:6379> set key 10.5
OK
127.0.0.1:6379> get key
"10.5"
127.0.0.1:6379> incrbyfloat key 0.5
"11"
127.0.0.1:6379> incrbyfloat key -0.5
"10.5"

append

字符串,也支持一些常用的操作。拼接,获取/修改 字符串的部分内容,获取字符串长度。

append返回值,长度的单位是字节。redis的字符串,不会对字符编码做任何处理.(redis不认识字符,只只认识字节)
当前咱们的xshell终端,默认的字符编码是utf8。在终端中输入汉字之后,也就是按照utf8编码的。一个汉字在utf8字符集中,通常是3个字节的。

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set key hello
OK
127.0.0.1:6379> append key world
(integer) 10
127.0.0.1:6379> get key
"helloworld"
127.0.0.1:6379> get key2
(nil)
127.0.0.1:6379> append key2 hello
(integer) 5
127.0.0.1:6379> get key2
"hello"
-- 一个汉字占三个字符
127.0.0.1:6379> append key3 你好
(integer) 6
-- 获取的是二进制编码不是汉字
127.0.0.1:6379> get key3
"\xe4\xbd\xa0\xe5\xa5\xbd"
-- ctrl + c 退出redis
-- 在启动redis客户端的时候,加上一个--raw这样的选项。
-- 就可以使redis客户端能够自动的把二进制数据尝试翻译
root@wyb:~# redis-cli --raw
127.0.0.1:6379> 
127.0.0.1:6379> get key3
你好

getrange

getrange是切割字符串,由start和end确定(左闭右闭)区间。redis中指定的区间,是闭区间。正常下标都是 从 0 开始的整数。redis 的下标是可以支持负数的。-1 倒数第一个元素,下标为 len-1 的元素

127.0.0.1:6379> set key helloworld
OK
127.0.0.1:6379> getrange key 0 -1
helloworld
127.0.0.1:6379> getrange key 1 -2
elloworl
-- 如果字符串中保存的是汉字,此时进行子串切分,很可能切出来的就不是完整的汉字了
127.0.0.1:6379> get key3
你好
127.0.0.1:6379> getrange key3 0 -1
你好
127.0.0.1:6379> getrange key3 1 -2
���

上述的代码,是强行切出了中间的四个字节。随便这么一切,切出的结果在 utf8 码表上不知道能査出啥了。

setrange

SETRANGE:覆盖字符串的一部分,从指定的偏移开始。

偏移量:(从第几个字节,开始进行替换)

返回值: 替换之后 新的字符串的长度

如果当前咱们 value 是一个中文字符串. 进行 setrange 的时候,是可能会搞出问题的。

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set key helloworld
OK
127.0.0.1:6379> setrange key 1 aaa
10
127.0.0.1:6379> get key
haaaoworld
127.0.0.1:6379> setrange key 1 bbbb
10
127.0.0.1:6379> get key
hbbbbworld
127.0.0.1:6379> setrange key 1 ccccccccccccccccccccccccccccccccccccccccccc
44
127.0.0.1:6379> get key
hccccccccccccccccccccccccccccccccccccccccccc
-- 凭空生成了个字节,这个字节里的内容就是 0x00aaa 就被追加到 0x00 的后面了
-- setrange 针对不存在的 key 也是可以操作的。不过会把 offset 之前的内容填充成0x00
127.0.0.1:6379> setrange key2 1 aaa
(integer) 4
127.0.0.1:6379> get key2
"\x00aaa"

strlen

获取key对应的string的长度。当key存放的类型不是string时,报错。

语法:strlen key

返回值:string的长度。或者当key不存在时,返回0。返回值的长度单位是字节

C++中,字符串的长度本身就是用字节为单位。Java 中,字符串的长度则是以字符为单位的。Java 中的一个 char ==2 字节。Java 中的 char 基于 unicode 这样的编码方式就能够表示中文等符号。MySQL 的时候,varchar(N)此处 N 的单位就是字符。 mysql 中的字符,也是完整的汉字这样的一个字符,也可能是多个字节。

Java 中的 char 是用的 unicode,一个汉字使用两个字节的。Java 中的 String, 则是用的 utf8,一个汉字就是 3 个字节了。Java 的标准库内部, 在进行上述的操作过程中,程序猿一般是感知不到编码方式的变换的。

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set key helloworld
OK
127.0.0.1:6379> strlen key
(integer) 10
127.0.0.1:6379> set key 你好
OK
127.0.0.1:6379> strlen key
(integer) 6
127.0.0.1:6379> strlen key2
(integer) 0
127.0.0.1:6379> lpush key3 111 222 333
(integer) 3
127.0.0.1:6379> strlen key3
(error) WRONGTYPE Operation against a key holding the wrong kind of value

string类型的编码

string 内部有三种编码方式

  1. int: 64 位/8字节 的整数

  2. embstr: 压缩字符串.适用于表示比较短的字符串。

  3. raw: 普通字符串, 适用于表示更长的字符串,只是单纯的持有字节数组

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set key 123
OK
127.0.0.1:6379> object encoding key
"int"
127.0.0.1:6379> set key2 hello
OK
127.0.0.1:6379> object encoding key2
"embstr"
127.0.0.1:6379> set key3 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
OK
127.0.0.1:6379> object encoding key3
"raw"
127.0.0.1:6379> set key4 1.5
OK
127.0.0.1:6379> object encoding key4
"embstr"

redis存储小数,本质上还是当做字符串来存储。这就和整数相比差别很大了,整数直接使用int来存(准确来说是一个long long (C++)/long (Java)),比较方便进行算术运算的。

小数则是使用字符串来。意味着每次进行算术运算,都需要把字符串转成小数,进行运算,结果再转回字符串保存

相关推荐

  1. 【redis】String类型命令

    2024-04-23 00:10:03       14 阅读
  2. Redis的基本数据类型命令

    2024-04-23 00:10:03       36 阅读
  3. Kubernetes 命令

    2024-04-23 00:10:03       35 阅读
  4. Pgsql命令

    2024-04-23 00:10:03       32 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-23 00:10:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-23 00:10:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-23 00:10:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-23 00:10:03       20 阅读

热门阅读

  1. 【前端】数组的常用处理函数

    2024-04-23 00:10:03       14 阅读
  2. JG/T 396-2012 外墙用非承重纤维增强水泥板检测

    2024-04-23 00:10:03       16 阅读
  3. ipad 连接WiFi无网络

    2024-04-23 00:10:03       16 阅读
  4. Vue 组件通信的几种方式

    2024-04-23 00:10:03       13 阅读
  5. C++:异常处理

    2024-04-23 00:10:03       14 阅读
  6. 计算机网络——应用层(3)电子邮件

    2024-04-23 00:10:03       15 阅读
  7. .net core8 自定义一个中间件

    2024-04-23 00:10:03       15 阅读
  8. node.js 什么是模板引擎?(具体介绍underscore)

    2024-04-23 00:10:03       14 阅读
  9. Android R framework修改低电量关机值为2%

    2024-04-23 00:10:03       15 阅读