Redis是常用基于内存的Key-Value数据库,比Memcache更先进,支持多种数据结构,高效,快速。用Redis可以很轻松解决高并发的数据访问问题;做为时时监控信号处理也非常不错。

一、安装redis服务端

1
root@zwx:~# apt-get install redis-server

1. 检查redis服务器系统进程

1
2
3
4
root@zwx:~# ps -aux|grep redis
redis 18676 0.0 0.3 40132 6764 ? Ssl 09:18 0:00 /usr/bin/redis-server 127
root 18711 0.0 0.0 14220 1020 pts/0 T 09:18 0:00 grep --color=auto redis
root 18715 0.0 0.0 14220 1088 pts/0 S+ 09:19 0:00 grep --color=auto redis

2. 通过启动命令检查redis服务器状态

1
2
root@zwx:~# netstat -nlt|grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN

3. 通过命令行客户端访问redis

安装Redis服务器,会自动地一起安装Redis命令行客户端程序。

在本机输入redis-cli命令就可以启动,客户端程序访问Redis服务器。

1
2
3
root@zwx:~# redis-cli
127.0.0.1:6379> help
redis-cli 3.0.6

4. 关闭客户端

1
2
127.0.0.1:6379> shutdown
not connected>

5.本地管理Redis

1
2
3
4
找到redis.windows.conf配置文件
找或者自己写配置requirepass 密码
然后打开redis-cli.exe或者cmd连接
然后输入密码连接 auth 密码

二、redis五大数据类型(string,list,set,hash,zset)

1. redis对key的操作(key不是五中数据类型之一)

  • 查看库里所有的key
1
2
127.0.0.1:6379> keys *
(empty list or set)
  • 添加一个key获取一个key(get,set)
1
2
3
4
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> get k1
"v1"
  • 判断某个键是否存在(exists)
1
2
3
4
127.0.0.1:6379> exists k1
(integer) 1

由于redis底层是C语言实现的,而C语言是没有Boolean类型的,所以redis用01来返回一个结果,0false1true
  • 查看一个键的类型(type)
1
2
127.0.0.1:6379> type k1
string
  • 删除某个键(del)
1
2
3
4
127.0.0.1:6379> del k1
(integer) 1
127.0.0.1:6379> exists k1
(integer) 0
  • 为键值设置过期时间,单位为秒(expire)
1
2
3
4
5
6
7
8
9
127.0.0.1:6379> set key1 v1
OK
127.0.0.1:6379> expire key1 10
(integer) 1
127.0.0.1:6379> keys *
1) "key1"
10秒之后~
127.0.0.1:6379> keys *
(empty list or set)
  • 查看键值还有多少秒过期,-1永不过期,-2已过期(ttl)
1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> set key1 v1
OK
127.0.0.1:6379> expire key1 10
(integer) 1
127.0.0.1:6379> ttl key1
(integer) 6
127.0.0.1:6379> ttl key1
(integer) 4
127.0.0.1:6379> ttl key1
(integer) -2
  • 查看当前数据库的key的数量(dbsize)
1
2
3
4
5
6
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> dbsize
(integer) 2
  • 清空当前库(flushdb)
1
flushdb
  • 通杀全部库(flushall)
1
flushall

当一不小心执行这两个命令之后就可以打开BOSS直聘了。。。

2.redis对String类型的操作

String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。

String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。

String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M。

  • 添加键值对、查询键值对(set,get)
1
2
3
4
127.0.0.1:6379> set k1 "hello"
OK
127.0.0.1:6379> get k1
"hello"
  • 将给定的value追加到原值的末尾(append)
1
2
3
4
5
6
127.0.0.1:6379> append k1 "world"
(integer) 10
127.0.0.1:6379> get k1
"helloworld"

若key不存在,则直接创建一对键值对
  • 获取值的长度(strlen)
1
2
127.0.0.1:6379> strlen k1
(integer) 10
  • 只有在key不存在时设置key的值(setnx)
1
2
3
4
5
6
7
8
127.0.0.1:6379> setnx k2 "hello"
(integer) 0
127.0.0.1:6379> del k2
(integer) 1
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> setnx k2 "hello"
(integer) 1
  • 将 key中储存的数字值增1,只能对数字值操作,如果为空,新增值为1(incr)
1
2
3
4
5
6
7
8
127.0.0.1:6379> incr k3
(integer) 1
127.0.0.1:6379> incr k3
(integer) 2
127.0.0.1:6379> incr k3
(integer) 3
127.0.0.1:6379> incr k3
(integer) 4
  • 将 key中储存的数字值减1,只能对数字值操作,如果为空,新增值为-1(decr)
1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> decr k3
(integer) 3
127.0.0.1:6379> decr k3
(integer) 2
127.0.0.1:6379> decr k3
(integer) 1
127.0.0.1:6379> decr k3
(integer) 0
127.0.0.1:6379> decr k3
(integer) -1
  • 将 key中储存的数字值增减,自定义步长(incrby/decrby)
1
incrby/decrby <key> <步长>
  • 同时设置一个或多个键值对(mset)
1
2
3
4
5
6
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
  • 同时获取一个或多个键的值(mget)
1
2
3
4
127.0.0.1:6379> mget k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
  • 获取值的范围,类似Java中的substring(getrange)
1
2
3
4
5
6
7
8
getrange  <key>  <起始位置>  <结束位置>

127.0.0.1:6379> get k4
"01234567"
127.0.0.1:6379> getrange k4 0 4
"01234"

语法规则:getrange <key> <起始位置> <结束为止> 04是包含的,即既包含头部也包含尾部
  • 覆盖所存储的字符串值,从起始位置开始(setrange)
1
2
3
4
5
6
setrange  <key>   <起始位置>   <value>

127.0.0.1:6379> setrange k4 4 "aaaaa"
(integer) 9
127.0.0.1:6379> get k4
"0123aaaaa"
  • 设置键值的同时设置过期时间(setex)
1
2
3
4
5
6
7
8
9
10
setex  <key>  <过期时间>   <value>

127.0.0.1:6379> setex k5 10 "hello"
OK
127.0.0.1:6379> ttl k5
(integer) 8
127.0.0.1:6379> ttl k5
(integer) 2
127.0.0.1:6379> ttl k5
(integer) -2
  • 以旧换新,设置了新值的同时获取旧值(getset)
1
2
3
4
5
6
getset <key>  <value>

127.0.0.1:6379> getset k4 "aaaaa"
"0123aaaaa"
127.0.0.1:6379> get k4
"aaaaa"

3.reids对list类型的操作

单键多值(可以重复,有顺序)

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)

它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差

1
2
3
4
5
	    value1
/
key1 -- value2
\
value3
  • 从左边或者右边插入一个或者多个值(lpush/rpush)
1
2
3
4
lpush/rpush  <key>  <value1>  <value2>  <value3> ....

127.0.0.1:6379> lpush l1 1 2 3 4
(integer) 4
  • 按照索引下标获取元素,从左到右(lrange)
1
2
3
4
5
6
7
8
lrange <key> <index>

127.0.0.1:6379> lrange l1 0 4
1) "4"
2) "3"
3) "2"
4) "1"
因为1是最先存进去的,又是从左边插入的,所以在从左到右的顺序来看,4在最左边,1在最右边,而且lrange又是从左边到右边来获取的元素,所以就是4 3 2 1
  • 从左边/右边吐出一个值,也可以叫删除一个值(lpop/rpop)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
lpop/rpop  <key> 

127.0.0.1:6379> keys *
1) "l1"
127.0.0.1:6379> lpop l1
"4"
127.0.0.1:6379> lpop l1
"3"
127.0.0.1:6379> lpop l1
"2"
127.0.0.1:6379> lpop l1
"1"
127.0.0.1:6379> lpop l1
(nil)
127.0.0.1:6379> keys *
(empty list or set)

当list中还有值的时候,键是存在的,当list中的值全部吐光的时候,键也就跟着消失了
  • 从1列表右边吐出一个值,插到2列表左边(rpoplpush)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
rpoplpush  <key1>  <key2>  

127.0.0.1:6379> lpush l1 1 2 3 4
(integer) 4
127.0.0.1:6379> rpoplpush l1 l2
"1"
127.0.0.1:6379> rpoplpush l1 l2
"2"
127.0.0.1:6379> rpoplpush l1 l2
"3"
127.0.0.1:6379> rpoplpush l1 l2
"4"
127.0.0.1:6379> lrange l1 0 4
(empty list or set)
127.0.0.1:6379> lrange l2 0 4
1) "4"
2) "3"
3) "2"
4) "1"
  • 按照索引下标获取元素(单个)(lindex)
1
2
3
4
5
6
7
8
9
10
11
lindex <key> <index>

127.0.0.1:6379> lrange l2 0 4
1) "4"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> lindex l2 1
"3"
127.0.0.1:6379> lindex l2 0
"4"
  • 获得列表长度(llen)
1
2
3
4
llen <key>

127.0.0.1:6379> llen l2
(integer) 4
  • 在列表某个值的后面插入新值(linsert)
1
2
3
4
5
6
7
8
9
10
linsert <key>  before <value>  <newvalue>

127.0.0.1:6379> linsert l2 before 4 5
(integer) 5
127.0.0.1:6379> lrange l2 0 5
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
  • 从左边删除n个值,从左到右(lrem)
1
2
3
4
5
6
7
8
9
10
11
12
13
127.0.0.1:6379> lrange l2 0 5
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lrem l2 1 3 (在l2中删除一个3
(integer) 1
127.0.0.1:6379> lrange l2 0 5
1) "5"
2) "4"
3) "2"
4) "1"

4.redis对set类型的操作

单键多值(不能重复,没有顺序)

redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)。

1
2
3
4
5
	    value1
/
key1 -- value2
\
value3
  • 将一个或多个member元素加入到集合key中,已经存在的元素会被忽略(sadd)
1
2
3
4
5
6
sadd <key>  <value1>  <value2> .....   

127.0.0.1:6379> sadd s1 v1 v2 v3
(integer) 3
127.0.0.1:6379> sadd s1 v3
(integer) 0
  • 取出该集合的所有值(smembers)
1
2
3
4
5
127.0.0.1:6379> smembers s1
1) "v3"
2) "v2"
3) "v1"
set存储数据的形式应该是无序的,此时s1中存储的值较少,所以无序不是特别明显
  • 判断集合key中是否含有每一个value值,含有返回1,不含有返回0(sismember)
1
2
127.0.0.1:6379> sismember s1 v2
(integer) 1
  • 返回该集合的元素个数(scard)
1
2
127.0.0.1:6379> scard s1
(integer) 3
  • 删除集合中的某个或者某些元素(srem)
1
2
3
4
127.0.0.1:6379> srem s1 v2 v3
(integer) 2
127.0.0.1:6379> smembers s1
1) "v1"
  • 随即从该集合中吐出一个值(spop)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
127.0.0.1:6379> sadd s1 v1 v2 v3 v4 v5
(integer) 4
127.0.0.1:6379> spop s1
"v5"
127.0.0.1:6379> spop s1
"v3"
127.0.0.1:6379> spop s1
"v1"
127.0.0.1:6379> spop s1
"v2"
127.0.0.1:6379> spop s1
"v4"
127.0.0.1:6379> spop s1
(nil)
127.0.0.1:6379> smembers s1
(empty list or set)
  • 随即从该集合中取出n个值,不会从集合中删除(srandmember)
1
2
3
4
5
6
7
8
9
10
11
12
127.0.0.1:6379> srandmember s1 3
1) "v3"
2) "v2"
3) "v1"
127.0.0.1:6379> srandmember s1 3
1) "v4"
2) "v2"
3) "v1"
127.0.0.1:6379> srandmember s1 3
1) "v5"
2) "v2"
3) "v1"
  • 返回两个元素的交集元素(sinter)
1
2
3
4
5
6
127.0.0.1:6379> sadd s2 v3 v4 v5 v6 v7
(integer) 5
127.0.0.1:6379> sinter s1 s2
1) "v4"
2) "v3"
3) "v5"
  • 返回两个集合的并集元素(sunion)
1
2
3
4
5
6
7
8
127.0.0.1:6379> sunion s1 s2
1) "v5"
2) "v7"
3) "v4"
4) "v6"
5) "v3"
6) "v2"
7) "v1"
  • 返回两个集合的差集元素(sdiff)
1
2
3
4
5
6
127.0.0.1:6379> sdiff s1 s2
1) "v1"
2) "v2"
127.0.0.1:6379> sdiff s2 s1
1) "v7"
2) "v6"

5.redis对hash类型的操作

单键多值

redis hash 是一个键值对集合

redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象

类似Java里面的Map<String,Object>

1
2
3
4
5
		field-value
/
key
\
field-value
  • 给key集合中的field键赋值value(hset)
1
2
3
4
hset <key>  <field>  <value>

127.0.0.1:6379> hset person1 name "zhangsan"
(integer) 1
  • 从key集合的field键中取出值value(hget)
1
2
3
hget <key> <field>
127.0.0.1:6379> hget person1 name
"zhangsan"
  • 批量设置hash的值(hmset)
1
2
3
4
hmset <key1>  <field1> <value1> <field2> <value2>...  

127.0.0.1:6379> hmset person1 age 18 city "shandong"
OK
  • 查看hash表key中,给定的field键是否存在(hexists)
1
2
3
4
hexists key  <field>

127.0.0.1:6379> hexists person1 age
(integer) 1
  • 列出名为key的哈希集合的所有的field键(hkeys)
1
2
3
4
127.0.0.1:6379> hkeys person1
1) "name"
2) "age"
3) "city"
  • 列出名为key的哈希集合的所有的value值(hvals)
1
2
3
4
127.0.0.1:6379> hvals person1
1) "zhangsan"
2) "18"
3) "shandong"
  • 列出名为key的哈希集合的所有field-value键值对
1
2
3
4
5
6
7
8
9
127.0.0.1:6379> hgetall person1
1) "name"
2) "zhangsan"
3) "age"
4) "20"
5) "city"
6) "shandong"
7) "birth"
8) "1998"
  • 为哈希表key中的field键的value值加上increment增量,值和增量必须为integer类型(hincrby)
1
2
3
4
5
6
hincrby <key> <field>  <increment> 

127.0.0.1:6379> hincrby person1 age 2
(integer) 20
127.0.0.1:6379> hget person1 age
"20"
  • 将哈希表key中的field键的值设置为value,只有当此field键不存在时才生效(hsetnx)
1
2
3
4
5
6
hsetnx <key>  <field> <value>

127.0.0.1:6379> hsetnx person1 age 18
(integer) 0
127.0.0.1:6379> hsetnx person1 birth 1998
(integer) 1

6.redis对zset类型的操作

单键多值

​ redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的没有成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。

​ 因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。

1
2
3
4
5
	    value1 (score)
/
key1 -- value2 (score)
\
value3 (score)
  • 将一个或多个member元素及其score值加入到有序集zset中(zadd)
1
2
3
4
zadd <key> <score> <value>

127.0.0.1:6379> zadd z1 100 v1 200 v2 300 v3
(integer) 3
  • 返回有序集key中,下标在start和stop之间的元素,如果带参数[withscores],可以让分数一起和值返回到结果集中(zrange)
1
2
3
4
5
6
7
8
9
10
11
12
13
zrange <key>  <start> <stop>  [WITHSCORES]   

127.0.0.1:6379> zrange z1 0 5
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> zrange z1 0 5 withscores
1) "v1"
2) "100"
3) "v2"
4) "200"
5) "v3"
6) "300"
  • 返回有序集 key 中,所有 score 值介于 min 和 max之间(包括等于 min 或 max)的成员。有序集成员按 score 值递增(从小到大)次序排列(zrangebyscore)
1
2
3
4
5
6
7
zrangebyscore key min max [withscores] [limit offset count]

127.0.0.1:6379> zrangebyscore z1 200 300 withscores
1) "v2"
2) "200"
3) "v3"
4) "300"
  • 同上,该为从大到小递增(zrevrangebyscore)
1
2
3
4
5
6
7
8
9
zrevrangebyscore key min max [withscores] [limit offset count]

127.0.0.1:6379> zrevrangebyscore z1 300 100 withscores
1) "v3"
2) "300"
3) "v2"
4) "200"
5) "v1"
6) "100"
  • 为元素的score值加上增量(zincrby)
1
2
3
4
zincrby <key> <increment> <value>

127.0.0.1:6379> zincrby z1 300 v3
"600"
  • 删除该集合下,指定值的元素(zrem)
1
2
3
4
5
6
7
 zrem  <key>  <value>  

127.0.0.1:6379> zrem z1 v1
(integer) 1
127.0.0.1:6379> zrange z1 0 5
1) "v2"
2) "v3"
  • 统计该集合,分数区间内的元素个数(zcount)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 zcount <key>  <min>  <max> 

127.0.0.1:6379> zadd z1 800 v4 1500 v5
(integer) 2
127.0.0.1:6379> zrange z1 0 6 withscores
1) "v2"
2) "200"
3) "v3"
4) "600"
5) "v4"
6) "800"
7) "v5"
8) "1500"
127.0.0.1:6379> zcount z1 100 1000
(integer) 3
  • 返回该value在集合key中的排名,排名从0开始(zrank)
1
2
3
4
5
6
7
8
9
10
11
12
13
 zrank <key>  <value> 

127.0.0.1:6379> zrange z1 0 6 withscores
1) "v2"
2) "200"
3) "v3"
4) "600"
5) "v4"
6) "800"
7) "v5"
8) "1500"
127.0.0.1:6379> zrank z1 v3
(integer) 1

评论