redis是一个开源的,先进的key-value存储。它通常被称为数据结构服务器,因为redis的key可以包含string、hash、list、set和zset。这些数据都支持push/pop、add/remove以及取交集并集等丰富的操作。redis支持各种不同方式的排序。为了保证效率,数据都是写入内存中,它可以周期性的把更新的数据写入到磁盘或者把修改的操作写入到追加的记录文件中。
【redis适用场合】
取最新N个数据的操作
排行榜应用,去topN操作
需要设置精确的过期时间的应用
计数器的应用
uniq操作,去重
实时系统,反垃圾系统
pub(发布)/sub(订阅)构建实时消息系统
构建队列系统
缓存
【redis的string数据类型】
1.set:设置值,成功返回OK
127.0.0.1:6379> set name huccOK127.0.0.1:6379>
2.get:获取key对应的值,如果key存在,返回对应的value,如果不存在,返回nil
127.0.0.1:6379> get name"hucc"127.0.0.1:6379> get name1(nil)127.0.0.1:6379>
3.setnx(set not exits):只有在key不存在时才做插入操作。
如果key存在,不插入,返回0。
如果key不存在,插入,返回1。
127.0.0.1:6379> setnx name hcc(integer) 0127.0.0.1:6379> setnx name1 hcc(integer) 1127.0.0.1:6379>
4.setex:为key设置值,同时指定key的生存时间。格式:set key time value
127.0.0.1:6379> setex name 10 huccOK127.0.0.1:6379>
上述例子:name这个key只存在10秒钟,10秒后自动销毁。
5.setrange:设置指定key的value值的子字符串。格式:setrange key num value
127.0.0.1:6379> set email hucc@163.comOK127.0.0.1:6379> get email"hucc@163.com"127.0.0.1:6379> setrange email 5 126.com(integer) 12127.0.0.1:6379> get email"hucc@126.com"127.0.0.1:6379>
从上述例子可以看出,setrange的功能是将163.com替换成了126.com。即email的第5位开始,执行成功后会返回字符串的长度。但是:看下面的例子
127.0.0.1:6379> get email"hucc@126.com"127.0.0.1:6379> setrange email 5 qq.com(integer) 12127.0.0.1:6379> get email"hucc@qq.comm"127.0.0.1:6379>
为什么将126.com替换成qq.com的时候多了一个m,因为setrange只会替换掉你指定的字符串的长度的字符串,说白了就是qq.com会替换掉126.co这6个字母,剩下的m会保留。
6.mset:一次性设置多个key和value,如果返回1,则都成功,如果返回0,则都失败。
127.0.0.1:6379> mset name1 hucc1 name2 hucc2OK127.0.0.1:6379> get name1"hucc1"127.0.0.1:6379> get name2"hucc2"127.0.0.1:6379>
7.msetnx:同理,不解释
8.getset:获取旧值并且设置新值
127.0.0.1:6379> set val 20OK127.0.0.1:6379> getset val 30"20"127.0.0.1:6379> get val"30"127.0.0.1:6379>
9.getrange:获取子字符串。格式:getrange email begin end
127.0.0.1:6379> get email"hucc@yahoo.com"127.0.0.1:6379> getrange email 1 5"ucc@y"127.0.0.1:6379>
10.mget:批量获取
127.0.0.1:6379> mget name name1 name2 name31) (nil)2) "hucc1"3) "hucc2"4) "hucc3"127.0.0.1:6379>
11.incr:自增,++。如果key不存在,则默认key的value值为0
127.0.0.1:6379> get val"30"127.0.0.1:6379> incr val(integer) 31127.0.0.1:6379> 127.0.0.1:6379> incr a(integer) 1127.0.0.1:6379>
12.incrby:自增多少次,接参数,如果参数为5,则自增5次,如果为-5,则自减5次。
127.0.0.1:6379> get val"20"127.0.0.1:6379> incrby val 5(integer) 25127.0.0.1:6379> incrby val -5(integer) 20127.0.0.1:6379>
13.decr、decrby,自减操作,和incr、incrby对立。
14.append:给指定的key后面添加值,返回新字符串的长度
127.0.0.1:6379> set name huccOK127.0.0.1:6379> append name " is a handsome boy"(integer) 22127.0.0.1:6379> get name"hucc is a handsome boy"127.0.0.1:6379>
15:strlen:获取指定key的值的长度。
127.0.0.1:6379> set name "hucc is a handsome boy"OK127.0.0.1:6379> strlen name(integer) 22127.0.0.1:6379>
【redis的hash数据类型】
hash是string类型的field和value的映射表,它的添加和删除都是o(1)。hash特别适用于存储对象,相比string把每个字段都存储成单个string类型,将一个对象都存储在hash中将更省内存,并且更加的方便存取整个对象。说白了就是string存储单个属性,hash适合存储整个对象。
1.hset:hash的设置方法。hset table field value(相当于与设置了对象一个属性,还能往里面添加)。
127.0.0.1:6379> hset person name hucc(integer) 1127.0.0.1:6379> hset person age 22(integer) 1127.0.0.1:6379> hset person saraly 9000(integer) 1
2.hsetnx,类似setnx。
3.hmset,类似mset
127.0.0.1:6379> hmset user:001 name hucc age 21 saraly 9000OK127.0.0.1:6379>
4.hincrby
5.hexits:查看某一个字段是否存在
6.hlen:查看某个对象里面的字段的数量
7.hdel:删除某个字段
8.hkeys:返回对象中所有的字段名。
9.hvals:返回对象中所有的value值。
10.hgetall:获取某个hash中全部的key和value,这个最好用
127.0.0.1:6379> hgetall user:0011) "name"2) "hucc"3) "age"4) "21"5) "saraly"6) "9000"127.0.0.1:6379>
【redis的list数据类型】
redis的list是一个链表结构,key是链表的名称,每一个子元素都是string类型的双向链表。可以通过push和pop操作从链表的头部或者尾部添加删除元素,这样list既可以作为栈,也可以作为队列。
1.lpush:从链表的头部压入一个元素
127.0.0.1:6379> lpush list1 hello(integer) 1127.0.0.1:6379> lpush list1 world(integer) 2
2.lrange:从指定链表的表头向表位方向取元素,范围为(start,stop)包含了start和stop两个元素。
命令:lrange key start stop
start和stop都是数字
0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
-1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推
取出所有元素的办法:lrange list 0 -1
127.0.0.1:6379> lrange list 0 -11) "world"2) "hello"127.0.0.1:6379>
3.rpush:每次从链表的尾部压入元素。
lpush配合lrange可以实现栈的效果
rpush配合lrange可以实现队列的效果
4.linsert:往链表的指定位置插入元素
127.0.0.1:6379> lrange list 0 -11) "hello"2) "world"127.0.0.1:6379> linsert list before world hucc(integer) 3127.0.0.1:6379> lrange list 0 -11) "hello"2) "hucc"3) "world"127.0.0.1:6379>
5.lset:替换掉链表指定下标的元素的值。LSET key index value
127.0.0.1:6379> lrange list 0 -11) "hello"2) "hucc"3) "world"127.0.0.1:6379> (error) ERR unknown command 'hello'127.0.0.1:6379> 127.0.0.1:6379> lrange list 0 -11) "hello"2) "hucc"3) "world"127.0.0.1:6379> lset list 1 hucocoOK127.0.0.1:6379> lrange list 0 -11) "hello"2) "hucoco"3) "world"127.0.0.1:6379>
6.LREM key count value
根据参数 count 的值,移除列表中与参数 value 相等的元素。
count 的值可以是以下几种:
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
count = 0 : 移除表中所有与 value 相等的值。
127.0.0.1:6379> lrange list 0 -11) "one"2) "two"3) "three"4) "one"127.0.0.1:6379> lrem list -1 "one"(integer) 1127.0.0.1:6379> lrange list 0 -11) "one"2) "two"3) "three"127.0.0.1:6379>
上述例子:从尾部开始删除一个one
7.LTRIM key start stop
对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
参数和lrange的参数是一样的意思。
127.0.0.1:6379> ltrim list 0 1OK127.0.0.1:6379> lrange list 0 -11) "one"2) "two"127.0.0.1:6379>
上述例子只想保留第一个和第二个元素。
8.lpop与rpop;分别是从头和从尾部弹出一个元素。并且返回这个元素的值。
9.rpoplpush list1 list2
命令 rpoplpush 在一个原子时间内,执行以下两个动作:
将列表 list1 中的最后一个元素(尾元素)弹出,并返回给客户端。
将 list1 弹出的元素插入到列表 list2 ,作为 list2 列表的的头元素。
10.lindex key index:获取链表指定下标的元素的内容
11.llen key:返回链表的长度。
【redis的set数据类型】
redis的set是集合,通过hash table实现的,它是string类型的无序集合。添加、删除和查找的复杂度都是o(1)。对于集合我们可以取并集、交集、差集。
1.SADD key member [member ...]
将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
127.0.0.1:6379> sadd set1 one(integer) 1127.0.0.1:6379> sadd set1 two(integer) 1127.0.0.1:6379> sadd set1 two(integer) 0127.0.0.1:6379>
2.SMEMBERS key
返回集合 key 中的所有成员。
不存在的 key 被视为空集合
127.0.0.1:6379> smembers set11) "one"2) "two"127.0.0.1:6379>
3.SREM key member [member ...]
移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。
当 key 不是集合类型,返回一个错误。
127.0.0.1:6379> srem set1 one(integer) 1127.0.0.1:6379> smembers set11) "two"
4.SPOP key
移除并返回集合中的一个随机元素。
如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用 SRANDMEMBER 命令。
5.SDIFF key [key ...]
返回一个集合的全部成员,该集合是所有给定集合之间的差集。
不存在的 key 被视为空集。
127.0.0.1:6379> smembers set11) "one"2) "two"127.0.0.1:6379> smembers set21) "two"2) "three"127.0.0.1:6379> sdiff set1 set21) "one"127.0.0.1:6379>
6.SDIFFSTORE destination key [key ...]
这个命令的作用和 SDIFF 类似,但它将结果保存到 destination 集合,而不是简单地返回结果集。
如果 destination 集合已经存在,则将其覆盖。
destination 可以是 key 本身。
7.sinter、sinterstore:交集
8.sunion、sunionstore:并集
9.SMOVE source destination member
将 member 元素从 source 集合移动到 destination 集合。
SMOVE 是原子性操作。
如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。
当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。
当 source 或 destination 不是集合类型时,返回一个错误。
10.SCARD key
返回集合 key 的个数(集合中元素的数量)。
11.SISMEMBER key member
判断 member 元素是否集合 key 的成员。
12.SRANDMEMBER key [count]
如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素。
从 Redis 2.6 版本开始, SRANDMEMBER 命令接受可选的 count 参数:
如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count大于等于集合基数,那么返回整个集合。
如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
该操作和 相似,但 将随机元素从集合中移除并返回,而 SRANDMEMBER 则仅仅返回随机元素,而不对集合进行任何改动。
【redis的sorted set数据类型】
redis的sorted set是有序集合,也被称为zset,它在set的基础上添加了一个顺序属性,这个属性在添加修改元素的时候可以指定,每次指定后,zset会重新调整顺序。
1.ZADD key score member [[score member] [score member] ...]
将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。
score 值可以是整数值或双精度浮点数。
如果 key 不存在,则创建一个空的有序集并执行 操作。
当 key 存在但不是有序集类型时,返回一个错误。
2.ZRANGE key start stop [WITHSCORES]
返回有序集 key 中,指定区间内的成员。
其中成员的位置按 score 值递增(从小到大)来排序。
具有相同 score 值的成员按字典序( )来排列。
如果你需要成员按 score 值递减(从大到小)来排列,请使用 命令。
下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
超出范围的下标并不会引起错误。
比如说,当 start 的值比有序集的最大下标还要大,或是 start > stop 时, 命令只是简单地返回一个空列表。
另一方面,假如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。
可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。
客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。
3.ZREVRANGE key start stop [WITHSCORES]
返回有序集 key 中,指定区间内的成员。
其中成员的位置按 score 值递减(从大到小)来排列。
具有相同 score 值的成员按字典序的逆序()排列。
除了成员按 score 值递减的次序排列这一点外, 命令的其他方面和 命令一样。
4.ZREM key member [member ...]
移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
当 key 存在但不是有序集类型时,返回一个错误。
5.ZINCRBY key increment member
为有序集 key
的成员 member
的 score
值加上增量 increment
。
可以通过传递一个负数值 increment
,让 score
减去相应的值,比如 ZINCRBY key -5 member
,就是让 member
的 score
值减去 5
。
当 key
不存在,或 member
不是 key
的成员时, ZINCRBY key increment member
等同于 ZADD key increment member
。
当 key
不是有序集类型时,返回一个错误。
score
值可以是整数值或双精度浮点数。
6.ZRANK key member
返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。
排名以 0 为底,也就是说, score 值最小的成员排名为 0 。
使用 命令可以获得成员按 score 值递减(从大到小)排列的排名。