前言
Redis 常用的数据结构有: String (字符串)、 List(列表)、Set(集合)、HashMap(哈希)、Sorted sets(有序集合)。不常用的有:Bitmaps(位图)、Hyperloglogs 、Geospatial。本文主要介绍如何Redis 中 String 的操作介绍 。
Redis 所有的数据结构和Java 中的HashMap 一样key 是唯一的并且这个key是一个字符串,然后通过唯一 key 值来获取
value 数据。而我们所说的 string(字符串)、 list(列表)、set(集合)、hashmap(哈希)、sorted
sets(有序集合) 等说的是value 结构的差异。
String 命令操作介绍
字符串类型是Redis中最为基础的数据存储类型,它是二进制安全的字符串,这就意味着它可以接受任何格式的数据。在Redis中字符串类型的value最多可以容纳的数据长度是512M
关于string 内存分配大致原理如下:
Redis 的字符串是动态字符串,是可以修改的字符串,内部结构实现上类似于 Java 的
ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配,如图中所示,内部为当前字符串实际分配的空间 capacity 一般要高于实际字符串长度 len。当字符串长度小于1M 时,扩容都是加倍现有的空间,如果超过 1M,扩容时一次只会多扩 1M 的空间。需要注意的是字符串最大长度为 512M。引用自:掘金小册【Redis 深度历险:核心原理与应用实践】
Docs命令操作
set
key value
向指定的key中添加 string 的value 返回ok,如果有则覆盖。
> SET mykey "Hello"
OK
> GET mykey
"Hello"
get
key
获取指定key的value值,返回值是string 的 value。
> SET mykey "Hello"
OK
> GET mykey
"Hello"
append
key value
向指定的key中value内容进行追加 返回值是 value 字符串的长度。
> APPEND mykey "Hello"
(integer) 5
> APPEND mykey " World"
(integer) 11
> GET mykey
"Hello World"
strlen
key
获取指定key中value字符串的长度
> SET mykey "Hello world"
OK
> STRLEN mykey
(integer) 11
> STRLEN nonexisting
(integer) 0
exists
key
判断指定 key 是否存在,如果存在返回 1 ,如果不存在返回 0。
> EXISTS mykey
(integer) 0
> set mykey "Hello"
OK
> EXISTS mykey
1
incr
key
对指定的 key 字符串进行递增1 操作,返回值递增后的值。value默认为整数字符串。
>exists personcount
0
>incr personcount
1
>get personcount
1
incrby
key value
对是整数的字符串递增指定增加多少的操作,返回值递增后的值。
> SET mykey "10"
OK
> INCRBY mykey 5
(integer) 15
redis>
decr
key
对指定的 key 字符串进行递减1 操作,返回值递减后的值。value默认为整数字符串。
> SET mykey "10"
OK
> DECR mykey
(integer) 9
decrby
key value
对是整数的字符串递增指定增加多少的操作,返回值递增后的值。
> SET mykey "10"
OK
> DECRBY mykey 3
(integer) 7
setex
key seconds value
原子性完成两个操作,一是设置该Key的值为指定字符串,同时设置该Key在Redis服务器中的存活时间(秒数)。
> SETEX mykey 10 "Hello"
OK
> TTL mykey
(integer) 10
> GET mykey
"Hello"
setnx
key value
如果指定的 key 不存在,则设定该 key 持有指定字符串 value,此时其效果等价于 set 命令。相反,如果该Key已经存在,该命令将不做任何操作并返回。 1表示设置成功,否则返回0。
> SETNX mykey "Hello"
(integer) 1
> SETNX mykey "World"
(integer) 0
> GET mykey
"Hello"
getset
key value
原子性的设置 key 的新 value,同时返回该 key 原有值。和 get 命令一样,该命令也只能处理string类型的 value,否则 Redis将给出相关的错误信息。如果该 key 之前并不存在,则返回nil。
> SET mykey "Hello"
OK
> GETSET mykey "World"
"Hello"
> GET mykey
"World"
setrange
key, offset newValue
向key 中的 vlaue值中的指定角标中替换为新的 value, 返回值是替换后的字符串的长度
> SET key1 "Hello World"
OK
> SETRANGE key1 6 "Redis"
(integer) 11
> GET key1
"Hello Redis"
getrange
key start end
获取指定 key 中 value 字符串从 start 到 end 角标的字符串的内容,返回值是截取字符串的内容。
> SET mykey "This is a string"
OK
> GETRANGE mykey 0 3
"This"
> GETRANGE mykey -3 -1
"ing"
> GETRANGE mykey 0 -1
"This is a string"
> GETRANGE mykey 10 100
"string"
mset
key value key2 value2 … …
该命令原子性的完成参数中所有 key/value 的设置操作,其具体行为可以看成是多次迭代执行 set 命令。 该命令不会失败,始终返回值总是 string字符串 OK
> MSET key1 "Hello" key2 "World"
OK
> GET key1
"Hello"
> GET key2
"World"
>
mget
key key2 … …
返回所有指定keys 的 values 的值,如果其中某个key不存在,或者其值不为string类型,该key的 value将返回nil。
> SET key1 "Hello"
OK
> SET key2 "World"
OK
> MGET key1 key2 nonexisting
1) "Hello"
2) "World"
3) (nil)
msetnx
key value key2 value2 … …
该命令原子性的完成参数中所有 key value的设置操作,其具体行为可以看成是多次迭代执行 setnx 命令。1表示所有key 都设置成功,0 则表示没有任何 key 被修改。
> MSETNX key1 "Hello" key2 "there"
(integer) 1
> MSETNX key2 "there" key3 "world"
(integer) 0
> MGET key1 key2 key3
1) "Hello"
2) "there"
3) (nil)
keys
key
该命令用于查询 执行名称的key 返回key的名称列表。keys * 表示查询所有的 key的列表。 key a * 表示查询以a为前缀的所有的key。
> keys *
1) a
2) mykey
3) personcount
>keys mykey
1) mykey
>keys mykey*
1) mykey
del
key
删除指定的 key 名称的的key-value 信息,返回删除的个数。
> keys *
1) a
2) mykey
3) personcount
> del a
1
> keys *
1) mykey
2) personcount
> keys *
1) mykey
2) personcount
>del mykey personcount
2
>keys *
>
Java 客户端操作 Redis
小结
本文尽可能把Docs 命令下 String 操作介绍了一下,并没有太多的去介绍 Java 客户端的操作。因为 Java 客户端的操作实际上也是执行 最为基础的 Docs命令。具体 Java 客户端操作就交给您去探索了。