14

Redis-String

 4 years ago
source link: https://aquan.run/archives/redis-string
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

本文章记录Redis中String数据类型的笔记

  • 结构
  • 内部编码
  • 命令和栗子

结构

key value hello world(字符串) counter 1(整型Redis这里会字符串类型转换) bits 10111101(二进制在位图有用到) data JSON数据" "

PS:value最多存512MB上限,Redis字符串类型用于场景这里举几个栗子,缓存,计数器(播放量和浏览量等),分布式锁等等。

内部编码

String类型的内部编码有三个分别是 intrawembstr ,下面介绍一下它们:

  • int编码 :保存 long 型的64位有符号整数
  • raw编码 :保存长度小于44字节的字符串
  • embstr编码 :保存长度大于44字节的字符串

可以利用 object encoding key 进行查看String类型的key是用的那些内部编码

127.0.0.1:6379> object encoding str
"raw"
127.0.0.1:6379> set str 123456789123456789 
OK
127.0.0.1:6379> object encoding str
"int"
127.0.0.1:6379> set str 1234567891234567899999
OK
127.0.0.1:6379> object encoding str
"embstr"

命令和栗子

get,set,del

API命令 详解 时间复杂度 get key 获取指定 key 的对应的value O(1) set key value 设置 key - value O(1) del key 删除 key - value O(1)
127.0.0.1:6379> get aquan
"aquan"
127.0.0.1:6379> set name "aquan"
OK
127.0.0.1:6379> get name
"aquan"
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)

incr, decr,incrby,decrby

API命令 详解 时间复杂度 incr key key自增1,如果不存在key,自增后get key = 1 O(1) decr key key自减1,如果不存在key,自减后get key = -1 O(1) incrby key num key自减num,如果不存在key,自减后get key = num O(1) decrby key count key自减num,如果不存在key,自增后get key = -num O(1)
127.0.0.1:6379> get count
(nil)
127.0.0.1:6379> incr count
(integer) 1
127.0.0.1:6379> get count
"1"
127.0.0.1:6379> incrby count 99
(integer) 100
127.0.0.1:6379> decr count
(integer) 99
127.0.0.1:6379> get coutn
(nil)

set,setnx,set xx

API命令 详解 时间复杂度 set key value 不管 key 是否存在,都设置 O(1) setnx key value key不存在,才设置(add) O(1) set key value xx key存在,才设置(updata) O(1)

PS: setnx 可以理解为数据的ADD操作, set xx 理解为更新操作

127.0.0.1:6379> exists name
(integer) 0
127.0.0.1:6379> set name "aquan"
OK
127.0.0.1:6379> setnx name "666"
(integer) 0
127.0.0.1:6379> get name
"aquan"
127.0.0.1:6379> set name "nb" xx
OK
127.0.0.1:6379> get name
"nb"
127.0.0.1:6379> exists java
(integer) 0
127.0.0.1:6379> setnx java "nb"
(integer) 1
127.0.0.1:6379> get java
"nb"

mget,mset

API命令 详解 时间复杂度 mget key1 key2 key3 ... 批量获取key O(n) mset key1 value1 key2 value2 .. 批量设置key - value O(n)
127.0.0.1:6379> mset key1 value1 key2 value2 key3 value3
OK
127.0.0.1:6379> mget key1 key2 key3
1) "value1"
2) "value2"
3) "value3"

PS:在适量的情况下 mget 比多次使用单个 get 获取key值效率高,速度快

getset,append,strlen

API命令 详解 时间复杂度 getset key value set key newvalue并且返回旧的value O(1) append key value 将value追加到旧的value O(1) strlen key 返回字符串的长度 O(1)

PS:注意中文使用 strlen 的时候,一个中文的长度为2

127.0.0.1:6379> getset name "aquan"
"nb"
127.0.0.1:6379> append name "666"
(integer) 8
127.0.0.1:6379> get name
"aquan666"
127.0.0.1:6379> strlen name
(integer) 8

incrbyfloat,getrange,setrange

API命令 详解 时间复杂度 incrbyfloat key 2.8 增加对应key的值2.8 O(1) getrange key start end 获取字符串指定下标所有的值 O(1) setrange key index value 设置指定下标所有对应的值 O(1)
127.0.0.1:6379> incr count
(integer) 100
127.0.0.1:6379> incrbyfloat count 2.8
"102.8"
127.0.0.1:6379> get count
"102.8"
127.0.0.1:6379> set str abcdef
OK
127.0.0.1:6379> getrange str 0 2
"abc"
127.0.0.1:6379> setrange str 2 "zzz"
(integer) 6
127.0.0.1:6379> get str
"abzzzf"

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK