redis学习笔记


【redis简介】html

    redis是一个开源的,先进的key-value存储。它一般被称为数据结构服务器,由于redis的key能够包含stringhashlistsetzset。这些数据都支持push/pop、add/remove以及取交集并集等丰富的操做。redis支持各类不一样方式的排序。为了保证效率,数据都是写入内存中,它能够周期性的把更新的数据写入到磁盘或者把修改的操做写入到追加的记录文件中。redis

【redis适用场合数组

  • 取最新N个数据的操做缓存

  • 排行榜应用,去topN操做bash

  • 须要设置精确的过时时间的应用服务器

  • 计数器的应用数据结构

  • uniq操做,去重app

  • 实时系统,反垃圾系统ide

  • pub(发布)/sub(订阅)构建实时消息系统spa

  • 构建队列系统

  • 缓存

【redis的string数据类型

1.set:设置值,成功返回OK

127.0.0.1:6379> set name hucc
OK
127.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) 0
127.0.0.1:6379> setnx name1 hcc
(integer) 1
127.0.0.1:6379>

4.setex:为key设置值,同时指定key的生存时间。格式:set key time value

127.0.0.1:6379> setex name 10 hucc
OK
127.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.com
OK
127.0.0.1:6379> get email
"hucc@163.com"
127.0.0.1:6379> setrange email 5 126.com
(integer) 12
127.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) 12
127.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 hucc2
OK
127.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 20
OK
127.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 name3
1) (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) 31
127.0.0.1:6379> 
127.0.0.1:6379> incr a
(integer) 1
127.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) 25
127.0.0.1:6379> incrby val -5
(integer) 20
127.0.0.1:6379>

13.decr、decrby,自减操做,和incr、incrby对立。

14.append:给指定的key后面添加值,返回新字符串的长度

127.0.0.1:6379> set name hucc
OK
127.0.0.1:6379> append name " is a handsome boy"
(integer) 22
127.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"
OK
127.0.0.1:6379> strlen name
(integer) 22
127.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) 1
127.0.0.1:6379> hset person age 22
(integer) 1
127.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 9000
OK
127.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:001
1) "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) 1
127.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 -1
1) "world"
2) "hello"
127.0.0.1:6379>

3.rpush:每次从链表的尾部压入元素。

  • lpush配合lrange能够实现栈的效果

  • rpush配合lrange能够实现队列的效果

4.linsert:往链表的指定位置插入元素

127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "world"
127.0.0.1:6379> linsert list before world hucc
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "hucc"
3) "world"
127.0.0.1:6379>

5.lset:替换掉链表指定下标的元素的值。LSET key index value

127.0.0.1:6379> lrange list 0 -1
1) "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 -1
1) "hello"
2) "hucc"
3) "world"
127.0.0.1:6379> lset list 1 hucoco
OK
127.0.0.1:6379> lrange list 0 -1
1) "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 -1
1) "one"
2) "two"
3) "three"
4) "one"
127.0.0.1:6379> lrem list -1 "one"
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "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 1
OK
127.0.0.1:6379> lrange list 0 -1
1) "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) 1
127.0.0.1:6379> sadd set1 two
(integer) 1
127.0.0.1:6379> sadd set1 two
(integer) 0
127.0.0.1:6379>

2.SMEMBERS key

返回集合 key 中的全部成员。

不存在的 key 被视为空集合

127.0.0.1:6379> smembers set1
1) "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) 1
127.0.0.1:6379> smembers set1
1) "two"

4.SPOP key

移除并返回集合中的一个随机元素。

若是只想获取一个随机元素,但不想该元素从集合中被移除的话,可使用 SRANDMEMBER 命令。

5.SDIFF key [key ...]

返回一个集合的所有成员,该集合是全部给定集合之间的差集。

不存在的 key 被视为空集。

127.0.0.1:6379> smembers set1
1) "one"
2) "two"
127.0.0.1:6379> smembers set2
1) "two"
2) "three"
127.0.0.1:6379> sdiff set1 set2
1) "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 的绝对值。

该操做和 SPOP 类似,但 SPOP 将随机元素从集合中移除并返回,而 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 不存在,则建立一个空的有序集并执行 ZADD 操做。

当 key 存在但不是有序集类型时,返回一个错误。

2.ZRANGE key start stop [WITHSCORES]

返回有序集 key 中,指定区间内的成员。

其中成员的位置按 score 值递增(从小到大)来排序。

具备相同 score 值的成员按字典序(lexicographical order )来排列。

若是你须要成员按 score 值递减(从大到小)来排列,请使用 ZREVRANGE 命令。

下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。

你也可使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。

超出范围的下标并不会引发错误。

好比说,当 start 的值比有序集的最大下标还要大,或是 start > stop 时, ZRANGE 命令只是简单地返回一个空列表。

另外一方面,假如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 看成最大下标来处理。

能够经过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。

客户端库可能会返回一些更复杂的数据类型,好比数组、元组等。

3.ZREVRANGE key start stop [WITHSCORES]

返回有序集 key 中,指定区间内的成员。

其中成员的位置按 score 值递减(从大到小)来排列。

具备相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列。

除了成员按 score 值递减的次序排列这一点外, ZREVRANGE 命令的其余方面和 ZRANGE 命令同样。

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 。

使用 ZREVRANK 命令能够得到成员按 score 值递减(从大到小)排列的排名。

相关文章
相关标签/搜索