文档:Redis高级应用.note
链接:http://note.youdao.com/noteshare?id=81f2ab61838b75ed5c938f74c22bff1d&sub=D225B90DF5CA4160939CBD2851687B4B
一、redis和memcached相比,的独特之处
1、redis可以持久化数据到硬盘,memcached只能做缓存。
redis可以用来做存储(storge),也就是redis可以将数据持久化到硬盘。 而memccached是用来做缓存(cache) 这个特点主要因为其有”持久化”的功能.
2、redis相比于memcached,其支持的数据类型更多。
存储的数据有”结构”,对于memcached来说,存储的数据,只有1种类型--”字符串”, 而redis则可以存储字符串,链表,哈希结构,集合,有序集合
二、redis的优点
1、读写速度快. 数据存放在内存中,数据结构类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
2、支持丰富的数据类型,string,hash,list,set,sorted
3、支持简单事务,watch
4、丰富的特性:可以用于缓存,消息队列按key设置过期时间,到期后自动删除
5、支持数据持久化(将内存数据持久化到磁盘),支持AOF和RDB两种持久化方式,从而进行数据恢复操作,可以有效地防止数据丢失
6、支持主从(master-slave)复制来实现数据备份,主机会自动将数据同步到从机
三、Redis目录下的重要文件的意义
1、redis-benchmark 性能测试工具
2、redis-check-aof 日志文件检测工(比如断电造成日志损坏,可以检测并修复)
3、redis-check-dump 快照文件检测工具,效果类上
4、redis-cli 客户端
5、redis-server 服务端
6、redis.windows.conf redis配置文件,在启动redis服务器的时候,必须要指定配置文件,那么相当于于一个配置文件就是一个redis数据库服务器。
redis服务器启动命令:
1 redis-server redis.windows.conf
四、redis基础命令
1、keys * //返回键(key)
2、keys list* //返回名以list开头的所有键(key)
3、exists list1 //判断键名为list1的是否存在 存在返回1, 不存在返回0
4、del list1 //删除一个键(名为list1)
5、expire list1 10 //设置键名为list1的过期时间为10秒后
6、ttl list1 //查看键名为list1的过期时间,若为-1表示已过期 或 永不过期
7、move age 1 //将键名age的转移到1数据库中。
8、select 1 //表示进入到1数据库中,默认在0数据库
9、persist age //移除age的过期时间。
10、flushdb:删除所有的数据 清除当前所在库的所有数据
11、flushall 清空所有数据
二、redis数据类型
1、String字符串
set——get
mset——mget
setnx——msetnx
incr——decr
incrby——decrby
setrange——getrange
1 127.0.0.1:6379> set name lijie
get:根据key获取value值
1 127.0.0.1:6379> get name
Setnx:设置一个不存的字符串,返回0 表示设置失败,已存在。返回1 表示设置新值成功,nx是not exist的意思。
1 127.0.0.1:6379> setnx name zs 2 (integer) 0 3 127.0.0.1:6379> setnx age 20 4 (integer) 1
setex:设置字符串,同时设置有效期。ex---expire(有效期)
1 127.0.0.1:6379> setex color 10 red
2 OK
3 立即查询
4 127.0.0.1:6379> get color"red"
5 10秒后查询
6 127.0.0.1:6379> get color
7 (nil)
Setrange:替换字符串——要替换什么, 从哪里开始(0), 替换成什么
1 127.0.0.1:6379> set email jalja@sina.com
2 OK
3 127.0.0.1:6379> get email
4 "jalja@sina.com"
5 127.0.0.1:6379> setrange email 6 163.com
6 (integer) 14
7 127.0.0.1:6379> get email
8 "jalja@163.comm"
Mset:一次设置多个key-value,返回OK表示全部设置成功,返回0表示全部失败。如果存在则替换。m--multi
1 127.0.0.1:6379> mset name1 zs name2 ls
2 OK
3 127.0.0.1:6379> get name1
4 "zs"
5 127.0.0.1:6379> get name2
6 "ls"
msetnx:一次设置多个不存在的key-value,返回1表示全部设置成功,返回0表示全部失败。
1 127.0.0.1:6379> msetnx name3 kk name4 mm name2 LL
2 (integer) 0
3 127.0.0.1:6379> get name3
4 (nil)
5 127.0.0.1:6379> get name4
6 (nil)
getset:获取原值,并设置新值
1 127.0.0.1:6379> getset name4 UU
2 (nil)
3 127.0.0.1:6379> get name4
4 "UU"
5 127.0.0.1:6379> getset name4 RR
6 "UU"
getrange:获取key对应value的子字符串
1 127.0.0.1:6379> get email
2 "jalja@163.comm"
3 127.0.0.1:6379> getrange email 0 4
4 "jalja"
mget:一次获取多个key对应的value值,不存在返回nil
1 127.0.0.1:6379> mget name1 name2 name3 name4 name5
2 1) "zs"
3 2) "ls"
4 3) (nil)
5 4) "RR"
6 5) (nil)
incr:对key对应的value做加1操作,并返回新值
1 127.0.0.1:6379> get age
2 "20"
3 127.0.0.1:6379> incr age
4 (integer) 21
incrby:与incr类似,加指定值,key不存在的时候会设置key,并认为该key原来的value=0
1 127.0.0.1:6379> get age
2 "21"
3 127.0.0.1:6379> incrby age 9
4 (integer) 30
5 127.0.0.1:6379> incrby age -5
6 (integer) 25
7 127.0.0.1:6379> incrby height 10
8 (integer) 10
decr:对key对应的value做减1操作
1 127.0.0.1:6379> get height
2 "10"
3 127.0.0.1:6379> decr height
4 (integer) 9
5 127.0.0.1:6379> decr height
6 (integer) 8
decrby:对key对应的value减去指定的值
1 127.0.0.1:6379> get height
2 "8"
3 127.0.0.1:6379> decrby height 3
4 (integer) 5
5 127.0.0.1:6379> decrby height -3
6 (integer) 8
append:对key对应的vlaue字符串追加,返回新字符串的长度
1 127.0.0.1:6379> get name1
2 "zs"
3 127.0.0.1:6379> append name1 ML
4 (integer) 4
5 127.0.0.1:6379> get name1
6 "zsML"
strlen:获取key对应value的长度
1 127.0.0.1:6379> get name1
2 "zsML"
3 127.0.0.1:6379> strlen name1
4 (integer) 4
2、Hash类型
Redis hash 是一个string类型的filed和value的映射表、它的添加、删除操作都是O(1)(平均操作)。Hash特别适合存储对象。相较于对象的每个字段存成单个string类型。将一个对象存储在hash类型中会占用更少的内存,并且可以更方便存取整个对象。
hset:设置hash filed 为指定值,如果key不存在,则先创建。key存在则替换
1 127.0.0.1:6379> hset user:001 name zs
2 (integer) 1
3 127.0.0.1:6379> hget user:001 name
4 "zs"
5 #设置一个user:001 的用户的name为zs(可以将user:001看做一个表)
hget:获取指定field字段的值
1 127.0.0.1:6379> hget user:001 name
2 (nil)
hsetnx:设置hash filed 为指定值,如果key不存在,则先创建。如果存在则返回0表示设置失败
1 127.0.0.1:6379> hsetnx user:001 name ML
2 (integer) 0
3 127.0.0.1:6379> hsetnx user:001 age 1
4 (integer) 1
hmset:同时设置hash的多个file
1 127.0.0.1:6379> hmset user:002 name MM age 20
2 OK
3 127.0.0.1:6379> hget user:002 name
4 "MM"
5 127.0.0.1:6379> hget user:002 age
6 "20"
hmget:获取全部指定的hash filed,必须指定获取的key的名称
1 127.0.0.1:6379> hmget user:002 name age
2 1) "MM"
3 2) "20"
hincrby:对hash filed加上指定的值
1 127.0.0.1:6379> hget user:002 age
2 "20"
3 127.0.0.1:6379> hincrby user:002 age 5
4 (integer) 25
5 127.0.0.1:6379> hincrby user:002 age -5
6 (integer) 20
hexists:测试指定的filed是否存在,返回1表示存在,返回0表示不存在
1 127.0.0.1:6379> hexists user:002 name
2 (integer) 1
3 127.0.0.1:6379> hexists user:002 age
4 (integer) 1
5 127.0.0.1:6379> hexists user:002 height
6 (integer) 0
hlen:返回指定hash的field的数量
1 127.0.0.1:6379> hlen user:002
2 (integer) 2
hdel 删除指定hash 的filed字段,返回1表示删除成功0:表示删除失败
1 127.0.0.1:6379> hget user:002 age
2 "20"
3 127.0.0.1:6379> hdel user:002 age
4 (integer) 1
5 127.0.0.1:6379> hdel user:002 age
6 (integer) 0
7 127.0.0.1:6379> hget user:002 age
8 (nil)
hkeys:返回hash 的所有filed
1 127.0.0.1:6379> hkeys user:001
2 1) "name"
3 2) "age"
4 127.0.0.1:6379> hkeys user:002
5 1) "name"
hvals:返回hash的所有value
1 127.0.0.1:6379> hvals user:001
2 1) "zs"
3 2) "1"
4 127.0.0.1:6379> hvals user:002
5 1) "MM"
3、List类型
List是一个链表结构,主要功能是push、pop,获取一个范围的所有值等等,操作中key理解为链表的名字。Redis的list类型其实就是一个每个子元素都是string类型的双向链表。我们可以通过push、pop操作链表的头部或者链表尾部添加元素,这样list既可以作为栈,又可以作为队列。
lpush:在key对应list的头部添加字符串元素,返回list中元素的个数
1 127.0.0.1:6379> lpush list1 "hello"
2 (integer) 1
3 127.0.0.1:6379> lpush list1 "word"
4 (integer) 2
lrange:获取list中的元素
1 127.0.0.1:6379> lrange list1 0 -1(0:第一个,-1:最后一个)
2 1) "word"
3 2) "hello"
rpush:在key对应的list尾部添加元素
1 127.0.0.1:6379> rpush list2 10
2 (integer) 1
3 127.0.0.1:6379> rpush list2 11
4 (integer) 2
5 127.0.0.1:6379> lrange list2 0 -1
6 1) "10"
7 2) "11"
linsert:在key对应list的特定位置前或后添加字符串
1 127.0.0.1:6379> lrange list2 0 -1
2 1) "10"
3 2) "11"
4 127.0.0.1:6379> linsert list2 before 11 10.5
5 (integer) 3
6 127.0.0.1:6379> linsert list2 after 11 11.5
7 127.0.0.1:6379> lrange list2 0 -1
8 1) "10"
9 2) "10.5"
10 3) "11"
11 4)"11.5"
lset:更改list中指定下标的元素,返回ok表示设置成功
1 127.0.0.1:6379> lrange list2 0 -1
2 1) "10"
3 2) "10.5"
4 3) "11"
5 127.0.0.1:6379> lset list2 1 10.00
6 OK
7 127.0.0.1:6379> lrange list2 0 -1
8 1) "10"
9 2) "10.00"
10 3) "11"
lrem:从key对应list中删除n个和value相同的元素(n<0 从尾部删除,n=0 全部删除,n>0从头部删除。
1 127.0.0.1:6379> lrange list 0 -1
2 1) "two"
3 2) "one"
4 3) "one"
5 127.0.0.1:6379> lrem list 1 one
6 (integer) 1
7 127.0.0.1:6379> lrange list 0 -1
8 1) "two"
9 2) "one"
ltrim:保留list中指定范围的数据,其他的都不要了
1 127.0.0.1:6379> lrange list2 0 -1
2 1) "10"
3 2) "10.00"
4 3) "11"
5 4) "12"
6 127.0.0.1:6379> ltrim list2 1 2
7 OK
8 127.0.0.1:6379> lrange list2 0 -1
9 1) "10.00"
10 2) "11"
lpop:从list的头部删除元素,并返回该元素
1 127.0.0.1:6379> lrange list 0 -1
2 1) "two"
3 2) "one"
4 127.0.0.1:6379> lpop list
5 "two"
6 127.0.0.1:6379> lrange list 0 -1
7 1) "one"
rpop:从list尾部删除元素,并返回该元素
rpoplpush:从第一个list的尾部删除元素,并添加到第二个list的头部
1 127.0.0.1:6379> lrange list 0 -1 2 1) "one" 3 127.0.0.1:6379> lrange list1 0 -1 4 1) "word" 5 2) "hello" 6 127.0.0.1:6379> rpoplpush list1 list 7 "hello" 8 127.0.0.1:6379> lrange list 0 -1 9 1) "hello" 10 2) "one" 11 127.0.0.1:6379> lrange list1 0 -1 12 1) "word"
lindex 返回名称为key的list中index位置的元素<===>list[index]
1 127.0.0.1:6379> lrange list 0 -1
2 1) "hello"
3 2) "one"
4 127.0.0.1:6379> lindex list 1
5 "one"
llen:返回指定key对应list的长度<====> len(list)
1 127.0.0.1:6379> lrange list 0 -1
2 1) "hello"
3 2) "one"
4 127.0.0.1:6379> llen list
5 (integer) 2
4、Sets类型
Set是一个string类型的无序集合,不允许重复。Set是通过hash table实现的。添加、删除、查找的复杂度都是0(1)。对集合我们可以取并集、交集、差集。
1 127.0.0.1:6379> sadd myset1 one
2 (integer) 1
3 127.0.0.1:6379> sadd myset1 two
4 (integer) 1
1 127.0.0.1:6379> smembers myset1
2 1) "two"
3 2) "one"
1 127.0.0.1:6379> srem myset1 two
2 (integer) 1
1 127.0.0.1:6379> smembers myset1
2 1) "three"
3 2) "one"
4 3) "four"
5 127.0.0.1:6379> spop myset1
6 "four"
7 127.0.0.1:6379> smembers myset1
8 1) "three"
9 2) "one"
1 127.0.0.1:6379> smembers myset1
2 1) "three"
3 2) "one"
4 127.0.0.1:6379> smembers myset2
5 1) "two"
6 2) "one"
7 127.0.0.1:6379> sdiff myset1 myset2
8 1) "three"
9 127.0.0.1:6379> sdiff myset2 myset1
10 1) "two"
1 127.0.0.1:6379> smembers myset1
2 1) "three"
3 2) "one"
4 127.0.0.1:6379> smembers myset2
5 1) "two"
6 2) "one"
7 127.0.0.1:6379> sdiffstore myset3 =myset1 -myset2
8 (integer) 1
9 127.0.0.1:6379> smembers myset3
10 1) "three"
1 127.0.0.1:6379> smembers myset1
2 1) "three"
3 2) "one"
4 127.0.0.1:6379> smembers myset2
5 1) "two"
6 2) "one"
7 127.0.0.1:6379> sinter myset1 myset2
8 1) "one"
1 127.0.0.1:6379> smembers myset1
2 1) "three"
3 2) "one"
4 127.0.0.1:6379> smembers myset2
5 1) "two"
6 2) "one"
7 127.0.0.1:6379> sinterstore myset4 =myset1 myset2
8 (integer) 1
1 127.0.0.1:6379> smembers myset1
2 1) "three"
3 2) "one"
4 127.0.0.1:6379> smembers myset2
5 1) "two"
6 2) "one"
7 127.0.0.1:6379> sunion myset1 myset2
8 1) "three"
9 2) "two"
10 3) "one"
1 127.0.0.1:6379> smembers myset1
2 1) "three"
3 2) "one"
4 127.0.0.1:6379> smembers myset2
5 1) "two"
6 2) "one"
7 127.0.0.1:6379> sunionstore myset5 myset1 myset2
8 (integer) 3
1 127.0.0.1:6379> smembers myset1
2 1) "three"
3 2) "one"
4 127.0.0.1:6379> smembers myset5
5 1) "three"
6 2) "two"
7 3) "one"
8 127.0.0.1:6379> smove myset5 myset1 two
9 (integer) 1
10 127.0.0.1:6379> smembers myset5
11 1) "three"
12 2) "one"
13 127.0.0.1:6379> smembers myset1
14 1) "three"
15 2) "two"
16 3) "one"
1 127.0.0.1:6379> smembers myset1
2 1) "three"
3 2) "two"
4 3) "one"
5 127.0.0.1:6379> scard myset1
6 (integer) 3
1 127.0.0.1:6379> smembers myset1
2 1) "three"
3 2) "two"
4 3) "one"
5 127.0.0.1:6379> sismember myset1 tree
6 (integer) 0
7 127.0.0.1:6379> sismember myset1 three
8 (integer) 1
1 127.0.0.1:6379> smembers myset1 2 1) "three" 3 2) "two" 4 3) "one" 5 127.0.0.1:6379> srandmember myset1 6 "one"
5、Sorted set (zset)类型
Sorted set是set的一个升级版,他在set的基础上增加了一个顺序属性,这一属性在添加元素的时候可以指定,每次指定后,zset会自动重新按新的值挑战顺序。可以理解为有两列的mysql表,一列存value,一列存顺序。操作key理解为zset的名字。
1 127.0.0.1:6379> zadd myzset1 1 one
2 (integer) 1
3 127.0.0.1:6379> zadd myzset1 2 two
4 (integer) 1
1 127.0.0.1:6379> zadd myzset1 1 one
2 (integer) 1
3 127.0.0.1:6379> zadd myzset1 2 two
4 (integer) 1
5 127.0.0.1:6379> zrange myzset1 0 -1 withscores
6 1) "one"
7 2) "1"
8 3) "two"
9 4) "2"
1 127.0.0.1:6379> zrange myzset1 0 -1 withscores
2 1) "one"
3 2) "1"
4 3) "two"
5 4) "2"
6 127.0.0.1:6379> zrem myzset1 two
7 (integer) 1
8 127.0.0.1:6379> zrange myzset1 0 -1 withscores
9 1) "one"
10 2) "1"
1 127.0.0.1:6379> zrange myzset1 0 -1 withscores
2 1) "one"
3 2) "1"
4 127.0.0.1:6379> zincrby myzset1 2 one
5 "3"
6 127.0.0.1:6379> zrange myzset1 0 -1 withscores
7 1) "one"
8 2) "3"
1 127.0.0.1:6379> zrange myzset1 0 -1 withscores
2 1) "one"
3 2) "3"
4 3) "four"
5 4) "4"
6 5) "five"
7 6) "5"
8 127.0.0.1:6379> zrank myzset1 four
9 (integer) 1
1 127.0.0.1:6379> zrange myzset1 0 -1 withscores
2 1) "one"
3 2) "3"
4 3) "four"
5 4) "4"
6 5) "five"
7 6) "5"
8 127.0.0.1:6379> zrevrank myzset1 four
9 (integer) 1
10 127.0.0.1:6379> zrevrank myzset1 five
11 (integer) 0
1 127.0.0.1:6379> zrange myzset1 0 -1 withscores
2 1) "one"
3 2) "3"
4 3) "four"
5 4) "4"
6 5) "five"
7 6) "5"
8 127.0.0.1:6379> zrevrange myzset1 0 -1 withscores
9 1) "five"
10 2) "5"
11 3) "four"
12 4) "4"
13 5) "one"
14 6) "3"
1 127.0.0.1:6379> zrange myzset1 0 -1 withscores
2 1) "one"
3 2) "3"
4 3) "four"
5 4) "4"
6 5) "five"
7 6) "5"
8 127.0.0.1:6379> zrangebyscore myzset1 4 5 withscores
9 1) "four"
10 2) "4"
11 3) "five"
12 4) "5"
1 127.0.0.1:6379> zrange myzset1 0 -1 withscores
2 1) "one"
3 2) "3"
4 3) "four"
5 4) "4"
6 5) "five"
7 6) "5"
8 127.0.0.1:6379> zcount myzset1 3 4
9 (integer) 2
1 127.0.0.1:6379> zrange myzset1 0 -1 withscores
2 1) "one"
3 2) "3"
4 3) "four"
5 4) "4"
6 5) "five"
7 6) "5"
8 127.0.0.1:6379> zcard myzset1
9 (integer) 3
1 127.0.0.1:6379> zrange myzset1 0 -1 withscores
2 1) "one"
3 2) "3"
4 3) "four"
5 4) "4"
6 5) "five"
7 6) "5"
8 127.0.0.1:6379> zremrangebyrank myzset1 1 2
9 (integer) 2
10 127.0.0.1:6379> zrange myzset1 0 -1 withscores
11 1) "one"
12 2) "3"
1 127.0.0.1:6379> zrange myzset1 0 -1 withscores
2 1) "one"
3 2) "3"
4 3) "four"
5 4) "4"
6 5) "five"
7 6) "5"
8 127.0.0.1:6379> zremrangebyscore myzset1 3 4
9 (integer) 2
10 127.0.0.1:6379> zrange myzset1 0 -1 withscores
11 1) "five"
12 2) "5"