前言

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 客户端操作就交给您去探索了。