redis 基本命令学习一(strings、hashes、lists)

strings 类型及操作

string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据, 比如 jpg 图片或者序列化的对象。 从内部实现来看其实 string 可以看作 byte 数组,最大上限是 1G 字节, 下面是string 类型的定义:
struct sdshdr {
long len;
long free;
char buf[];
};
len 是 buf 数组的长度。
free 是数组中剩余可用字节数, 由此可以理解为什么 string 类型是二进制安全的了, 因为它本质上就是个 byte 数组, 当然可以包含任何数据了
buf 是个 char 数组用于存贮实际的字符串内容, 其实 char 和 c#中的 byte 是等价的,都是一个字节。
另外 string 类型可以被部分命令按 int 处理.比如 incr 等命令, 如果只用 string 类型, redis 就可以被看作加上持久化特性的 memcached。 当然 redis 对 string 类型的操作比 memcached 还是多很多的,具体操作方法如下:
127.0.0.1:6379> SET name "fyl"   :设置 key values
127.0.0.1:6379> get name         :根据 key 取values
"fyl"
127.0.0.1:6379> SETNX name "fyl_new"   : 如果 key 已经存在,返回 0, nx 是 not exist 的意思。
(integer) 0
127.0.0.1:6379> get name    :key有原有值,不改变值
"fyl"

127.0.0.1:6379> SETEX info 5 "hello"  :设置 key values,并且5秒后过期
OK
127.0.0.1:6379> get info
"hello"
127.0.0.1:6379> get info
(nil)

127.0.0.1:6379> set mail "[email protected]"
OK
127.0.0.1:6379> get mail
"[email protected]"
127.0.0.1:6379>  SETRANGE mail 4 "google.com"   :把key mail第4个字符替换
(integer) 14
127.0.0.1:6379> get mail
"[email protected]"

127.0.0.1:6379> mset name haha age 11   : 一次设置多个key
OK
127.0.0.1:6379> mget name age  : 一次取多个key
1) "haha"
2) "11"


127.0.0.1:6379> MSETNX key1 11 key2 22 :key都不存在设置成功
(integer) 1
127.0.0.1:6379> mget key1 key2
1) "11"
2) "22"
127.0.0.1:6379> MSETNX key1 33 key3 fds  :key key1 存在,所以全部回滚
(integer) 0
127.0.0.1:6379> mget key1 key3
1) "11"
2) (nil)

127.0.0.1:6379> GETSET key1 haha   :取key的旧值,并设置新的values
"11"
127.0.0.1:6379> get key1
"haha"
127.0.0.1:6379> GETSET key4 haha  :取key的旧值,并设置新的values,key不存在时,返回空
(nil)

127.0.0.1:6379> get mail
"[email protected]"
127.0.0.1:6379> GETRANGE mail 0 2   :取value的范围
"fyl"
127.0.0.1:6379> GETRANGE mail -10 -1  :range  整数从0开始,负数从-1 开始
"google.com"

127.0.0.1:6379> mget name age k :一次取多个key,key不存在时 返回nil
1) "haha"
2) "11"
3) (nil)

127.0.0.1:6379> get age
"11"
127.0.0.1:6379> INCR age   : value ++ 操作
(integer) 12
127.0.0.1:6379> get age
"12"
127.0.0.1:6379> INCRBY age 5  :按步长5 ++
(integer) 17
127.0.0.1:6379> INCRBY age1 5  : key 不存在时,会设置key 默认value 为0
(integer) 5
127.0.0.1:6379> DECR age :value-- 操作,key不存在 会是-1
(integer) 16
127.0.0.1:6379> DECRBY age 3 :按步长3--
(integer) 13


127.0.0.1:6379> set name haha
OK
127.0.0.1:6379> APPEND name @126.com  :给指定 key 的字符串值追加 value,返回新字符串值的长度。
(integer) 12
127.0.0.1:6379> get name
"[email protected]"

127.0.0.1:6379> get name
"[email protected]"
127.0.0.1:6379> STRLEN name  :取指定 key 的 value 值的长度。
(integer) 12
hashes 类型及操作

Redis hash 是一个 string 类型的 field 和 value 的映射表.它的添加、删除操作都是 O(1) (平均)。hash 特别适合用于存储对象。相较于将对象的每个字段存成单个 string 类型。将一个对象存储在 hash 类型中会占用更少的内存,并且可以更方便的存取整个对象。省内存的原因是新建一个 hash 对象时开始是用 zipmap(又称为 small hash)来存储的。这个 zipmap 其实并不是 hash table,但是 zipmap 相比正常的 hash 实现可以节省不少 hash 本身需要的一些元数据存储开销。尽管 zipmap 的添加,删除,查找都是 O(n),但是由于一般对象的 field 数量都不太多。所以使用 zipmap 也是很快的,也就是说添加删除平均还是 O(1)。如果 field 或者 value的大小超出一定限制后, Redis 会在内部自动将 zipmap 替换成正常的 hash 实现. 这个限制可以在配置文件中指定
hash-max-zipmap-entries 64 #配置字段最多 64 个
hash-max-zipmap-value 512 #配置 value 最大为 512 字节
127.0.0.1:6379> hset myhash field1 Hello  :设置 hash field 为指定值,如果 key 不存在,则先创建。
(integer) 1
127.0.0.1:6379> hsetnx myhash field "Hello" :设置 hash field 为指定值,如果 key 不存在,则先创建。 如果 field 已经存在,返回 0, nx 是not exist 的意思。
(integer) 1
127.0.0.1:6379> hsetnx myhash field "Hello"
(integer) 0
127.0.0.1:6379> hmset myhash field1 Hello field2 World :同时设置 hash 的多个 field。
OK
127.0.0.1:6379> HGET myhash field1
"Hello"
127.0.0.1:6379> HGET myhash field2
"World"
127.0.0.1:6379> HGET myhash field3
(nil)
127.0.0.1:6379> HMGET myhash field1 field2 field3
1) "Hello"
2) "World"
3) (nil)


127.0.0.1:6379> hset myhash field3 20
(integer) 1
127.0.0.1:6379> hget myhash field3
"20"
127.0.0.1:6379> HINCRBY myhash field3 -5  :指定的 hash filed 加上给定值。
(integer) 15
127.0.0.1:6379> hget myhash field3
"15"
127.0.0.1:6379> HEXISTS myhash field3  :验证hash key是否存在
(integer) 1
127.0.0.1:6379> HEXISTS myhash field4
(integer) 0
127.0.0.1:6379> HLEN myhash  :返回指定 hash 的 field 数量。
(integer) 3
127.0.0.1:6379> hdel myhash field1  :删除指定 hash 的 field 。
(integer) 1
127.0.0.1:6379> HLEN myhash
(integer) 2

127.0.0.1:6379> HKEYS myhash  :返回 hash 的所有 field
1) "field2"
2) "field3"
127.0.0.1:6379> HVALS myhash  : 返回 hash 的 所有value
1) "World"
2) "15"

127.0.0.1:6379> HGETALL myhash  :获取某个 hash 中全部的 filed 及 value
1) "field2"
2) "World"
3) "field3"
4) "15"
lists 类型及操作

list 是一个链表结构,主要功能是 push、 pop、获取一个范围的所有值等等, 操作中 key 理解为链表的名字。
Redis 的 list 类型其实就是一个每个子元素都是 string 类型的双向链表。链表的最大长度是(2的 32 次方)。我们可以通过 push,pop 操作从链表的头部或者尾部添加删除元素。这使得 list既可以用作栈,也可以用作队列。
有意思的是 list 的 pop 操作还有阻塞版本的,当我们[lr]pop 一个 list 对象时,如果 list 是空,或者不存在,会立即返回 nil。但是阻塞版本的 b[lr]pop 可以则可以阻塞,当然可以加超时时间,超时后也会返回 nil。为什么要阻塞版本的 pop 呢,主要是为了避免轮询。举个简单的例子如果我们用 list 来实现一个工作队列。执行任务的 thread 可以调用阻塞版本的 pop 去获取任务这样就可以避免轮询去检查是否有任务存在。当任务来时候工作线程可以立即返回,也可以避免轮询带来的延迟。说了这么多,接下来看一下实际操作的方法吧:
127.0.0.1:6379> LPUSH mylist "word"
(integer) 1
127.0.0.1:6379> LPUSH mylist "hello"
(integer) 2
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "word"
在此处我们先插入了一个 world,然后在 world 的头部插入了一个 hello。其中 lrange 是用于取 mylist 的内容
127.0.0.1:6379> RPUSH mylist "word"   :尾部插入
(integer) 3
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "word"
3) "word"

127.0.0.1:6379> LINSERT mylist before "word" "fyl"  :在list的"word" 前插入 "fyl"
(integer) 4
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "fyl"
3) "word"
4) "word"

127.0.0.1:6379> LSET mylist 3 "good" :设置list的值,下标从0开始
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "fyl"
3) "word"
4) "good"
127.0.0.1:6379> LSET mylist -2 "haha"
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "fyl"
3) "haha"
4) "good"


127.0.0.1:6379> RPUSH m5 "hello"
(integer) 1
127.0.0.1:6379> RPUSH m5 "hello"
(integer) 2
127.0.0.1:6379> RPUSH m5 "qwe"
(integer) 3
127.0.0.1:6379> RPUSH m5 "hello"
(integer) 4
127.0.0.1:6379> LRANGE m5 0 -1
1) "hello"
2) "hello"
3) "qwe"
4) "hello"
127.0.0.1:6379> LREM m5 2 "hello"  :从 key 对应 list 中删除 count 个和 value 相同的元素,count>0 时,按从头到尾的顺序删除
(integer) 2
127.0.0.1:6379> LRANGE m5 0 -1
1) "qwe"
2) "hello"

127.0.0.1:6379> RPUSH m6 "hello"
(integer) 1
127.0.0.1:6379> RPUSH m6 "hello"
(integer) 2
127.0.0.1:6379> RPUSH m6 "qwe"
(integer) 3
127.0.0.1:6379> RPUSH m6 "hello"
(integer) 4
127.0.0.1:6379> LRANGE m6 0 -1
1) "hello"
2) "hello"
3) "qwe"
4) "hello"
127.0.0.1:6379> LREM m6 -2 "hello"  :count<0 时,按从尾到头的顺序删除!!count=0 时,删除全部
(integer) 2
127.0.0.1:6379> LRANGE m6 0 -1
1) "hello"
2) "qwe"

127.0.0.1:6379> RPUSH m7 "one"
(integer) 1
127.0.0.1:6379> RPUSH m7 "two"
(integer) 2
127.0.0.1:6379> RPUSH m7 "three"
(integer) 3
127.0.0.1:6379> RPUSH m7 "four"
(integer) 4
127.0.0.1:6379> LRANGE m7 0 -1
1) "one"
2) "two"
3) "three"
4) "four"
127.0.0.1:6379> LTRIM m7 2 -1   :保留指定 key 的值范围内的数据
OK
127.0.0.1:6379> LRANGE m7 0 -1
1) "three"
2) "four"
127.0.0.1:6379> LPUSH m7 "two"  :list左 加一个值
(integer) 3
127.0.0.1:6379> LRANGE m7 0 -1
1) "two"
2) "three"
3) "four"
127.0.0.1:6379> RPOP m7  :list右端删除一个value,并返回
"four"
127.0.0.1:6379> LRANGE m7 0 -1
1) "two"
2) "three"
127.0.0.1:6379> LPOP m7 :list左端删除一个value,并返回
"two"
127.0.0.1:6379> LRANGE m7 0 -1
1) "three"


127.0.0.1:6379> LRANGE m6 0 -1
1) "hello"
2) "qwe"
127.0.0.1:6379> LRANGE m7 0 -1
1) "three"
2) "four"
127.0.0.1:6379> RPOPLPUSH m6 m7 :从第一个 list 的尾部移除元素并添加到第二个 list 的头部,最后返回被移除的元素值,整个操作是原子的.如果第一个 list 是空或者不存在返回 nil
"qwe"
127.0.0.1:6379> LRANGE m6 0 -1
1) "hello"
127.0.0.1:6379> LRANGE m7 0 -1
1) "qwe"
2) "three"
3) "four"
127.0.0.1:6379> LINDEX m7 1 :返回名称为 key 的 list 中 index 位置的元素
"three"
127.0.0.1:6379> LLEN m7  :返回 key 对应 list 的长度
(integer) 3


你可能感兴趣的:(redis,NoSQL)