Redis 是一个开源的,内存中的数据结构存储系统(一个高性能的key-value数据库),它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,并且所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
1,Redis 的键
Redis key值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个JPEG文件的内容都可以。空字符串也是有效key值,键不应该太长和太短,可以这样取名 ”user:1000:password”,”comment:1234:reply.to”。
127.0.0.1:6379> set " " ef
OK
127.0.0.1:6379> get " "
"ef"
2,Redis 字符串(String)
这是最简单Redis类型。
语法:
Set key value 设置指定 key 的值
Get key 获取指定 key 的值。
127.0.0.1:6379> set strkey strvalue
OK
127.0.0.1:6379> get strkey
"strvalue"
3,Redis INCR key
类似java中的i++,对存储在指定key
的数值执行原子的加1操作。如果指定的key不存在,那么在执行incr操作之前,会先将它的值设定为0
。如果指定的key中存储的值不是字符串类型或者存储的字符串类型不能表示为一个整数,那么提示出错
127.0.0.1:6379> incr strkey
(error) ERR value is not an integer or out of range
注意: 由于redis并没有一个明确的类型来表示整型数据,所以这个操作是一个字符串操作。incr key执行后返回值:执行递增操作后key
对应的值。
127.0.0.1:6379> set s1 10
OK
127.0.0.1:6379> incr s1
(integer) 11
127.0.0.1:6379> incr s1
(integer) 12
127.0.0.1:6379> get s1
"12"
Redis的原子递增操作最常用的使用场景是计数器。使用思路是:每次有相关操作的时候,就向Redis服务器发送一个incr命令。例如这样一个场景:我们有一个web应用,我们想记录每个用户每天访问这个网站的次数。web应用只需要通过拼接用户id和代表当前时间的字符串作为key,每次用户访问这个页面的时候对这个key执行一下incr命令。
类似INCR的命令还有 incrby(将key对应的数字value加N), decr(类似 i--) 和 decrby(将key对应的数字value减N)。
4,Redis的 EXISTS、Del、Type
语法:
EXISTS key 检查给定 key 是否存在。
DEL key 该命令用于在 key 存在是删除 key。
TYPE key 返回 key 所储存的值的类型。
它们可被用于任何类型的键,使用EXISTS命令返回1或0标识给定key的值是否存在,使用DEL命令可以删除key对应的值,DEL命令返回1或0标识值是被删除(值存在)或者没被删除(key对应的值不存在),TYPE命令可以返回key对应的值的存储类型。
127.0.0.1:6379> get s1
"12"
127.0.0.1:6379> exists s1
(integer) 1
127.0.0.1:6379> del s1
(integer) 1
127.0.0.1:6379> exists s1
(integer) 0
127.0.0.1:6379> del s1
(integer) 0
127.0.0.1:6379> type s1
none
127.0.0.1:6379> get s1
(nil)
127.0.0.1:6379> set s1 10
OK
127.0.0.1:6379> type s1
string
5,Redis的EXPIRE
数据在限定时间内存活,一个与值类型无关的Redis特性,你可以对key设置一个超时时间,当这个时间到达后会被删除。精度可以使用毫秒或秒。TTL命令用来查看key对应的值剩余存活时间。
语法:
EXPIRE key seconds 为给定 key 设置过期时间。
TTL key 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
127.0.0.1:6379> get s1
"10"
127.0.0.1:6379> expire s1 10
(integer) 1
127.0.0.1:6379> ttl s1
(integer) 5
127.0.0.1:6379> ttl s1
(integer) -2
6,Redis List
LPUSH 命令可向list的左边(头部)添加一个新元素,而RPUSH命令可向list的右边(尾部)添加一个新元素。LRANGE命令可从list中取出一定范围的元素。
语法:
LPOP key 移出并获取列表的第一个元素
RPOP key 移除并获取列表最后一个元素
LPUSH key value1 [value2] 将一个或多个值插入到列表头部
RPUSH key value1 [value2] 在列表中添加一个或多个值
LRANGE key start stop 获取列表指定范围内的元素
127.0.0.1:6379> rpush mylist A
(integer) 1
127.0.0.1:6379> rpush mylist B
(integer) 2
127.0.0.1:6379> lpush mylist first
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"
注意:LRANGE带有两个索引,一定范围的第一个和最后一个元素。这两个索引都可以为负来告知Redis从尾部开始计数,因此-1表示最后一个元素,-2表示list中的倒数第二个元素,以此类推。Redis List还可以一次向list存入多个值。
127.0.0.1:6379> rpush mylist 1 2 3 4 5 "foo bar"
(integer) 9
127.0.0.1:6379> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"
4) "1"
5) "2"
6) "3"
7) "4"
8) "5"
9) "foo bar"
POP命令,它从list中删除元素并同时返回删除的值。可以在左边或右边操作。
127.0.0.1:6379> rpush mylist2 a b c
(integer) 3
127.0.0.1:6379> rpop mylist2
"c"
127.0.0.1:6379> rpop mylist2
"b"
127.0.0.1:6379> rpop mylist2
"a"
127.0.0.1:6379> rpop mylist2
(nil)
List使用的常见案例:
正如你可以从上面的例子中猜到的,list可被用来实现聊天系统。还可以作为不同进程间传递消息的队列。关键是,你可以每次都以原先添加的顺序访问数据。这不需要任何SQL ORDER BY 操作,将会非常快,也会很容易扩展到百万级别元素的规模。例如在评级系统中,比如社会化新闻网站 reddit.com,你可以把每个新提交的链接添加到一个list,用LRANGE可简单的对结果分页。在博客引擎实现中,你可为每篇日志设置一个list,在该list中推入博客评论,等等。
7,Redis hash
一个string类型的field和value的映射表,hash特别适合用于存储对象。
语法:
HSET key field value 将哈希表 key 中的字段 field 的值设为 value 。
HGET key field 获取存储在哈希表中指定字段的值/td>
HMGET key field1 [field2] 获取所有给定字段的值
HMSET key field1 value1 [field2 value2 ] 同时将多个 field-value (域-值)对设置到哈希表 key 中。
HGETALL key 获取在哈希表中指定 key 的所有字段和值
127.0.0.1:6379> hmset user:1000 username zhangsan birthyear 1999 age 18
OK
127.0.0.1:6379> hget user:1000 username
"zhangsan"
127.0.0.1:6379> hget user:1000 birthyear
"1999"
127.0.0.1:6379> hgetall user:1000
1) "username"
2) "zhangsan"
3) "birthyear"
4) "1999"
5) "age"
6) "18"
127.0.0.1:6379> hmget user:1000 username birthyear age
1) "zhangsan"
2) "1999"
3) "18"
8,Redis 无序集合(set)
Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
语法:
SADD key member1 [member2] 向集合添加一个或多个成员
SMEMBERS key 返回集合中的所有成员
SPOP key 移除并返回集合中的一个随机元素
SISMEMBER key member 判断 member 元素是否是集合 key 的成员
SRANDMEMBER key[count] 返回集合中一个或多个随机数
SUNIONSTORE destination key1 [key2] 所有给定集合的并集存储在 destination 集合中
SINTERSTORE destination key1 [key2] 返回给定所有集合的交集并存储在 destination 中
SDIFFSTORE destination key1 [key2] 返回给定所有集合的差集并存储在 destination 中
127.0.0.1:6379> sadd myset1 a
(integer) 1
127.0.0.1:6379> sadd myset1 b
(integer) 1
127.0.0.1:6379> sadd myset1 c
(integer) 1
127.0.0.1:6379> smembers myset1
1) "b"
2) "c"
3) "a"
9,Redis 有序集合(sorted set)
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。
语法:
ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合成指定区间内的成员
ZREM key member [member...] 移除有序集合中的一个或多个成员
127.0.0.1:6379> zadd myzset 5 b 4 c 3 d 2 a
(integer) 4
127.0.0.1:6379> zrange myzset 0 10
1) "a"
2) "d"
3) "c"
4) "b"
127.0.0.1:6379> zrange myzset 0 10 withscores
1) "a"
2) "2"
3) "d"
4) "3"
5) "c"
6) "4"
7) "b"
8) "5"
更多命令请查看: