redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。
对比项 | Memcached | Redis |
---|---|---|
类型 | Key-value数据库 | Key-value数据库 |
过期策略 | 支持 | 支持 |
数据类型 | 单一数据类型 | 多种数据类型 |
持久化 | 不支持 | 支持 |
主从复制 | 不支持 | 支持 |
虚拟内存 | 不支持 | 支持(不建议使用) |
配置repo,yum安装redis
[root@redis ~]# wget -O /etc/yum.repos.d/epel-6.repo http://mirrors.aliyun.com/repo/epel-6.repo
[root@redis ~]# yum install redis -y
[root@redis ~]# rpm -qa redis # 这个版本的可以有命令用法提示,可TAB补全
redis-3.2.12-1.el6.x86_64
[root@redis ~]# rpm -ql redis
修改bind为本地ip地址
[root@redis ~]# vim /etc/redis.conf
bind 10.0.0.10
启动redis
[root@redis ~]# /etc/init.d/redis start
启动 : [确定]
[root@redis ~]# lsof -i :6379
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 6844 redis 4u IPv4 46720 0t0 TCP 10.0.0.10:6379 (LISTEN)
概念:http://redis.cn/topics/data-types.html#strings
命令 | 作用 |
---|---|
SET key value [EX seconds] [PX milliseconds] [NX|XX] |
设置Key |
GET key |
获取Key的值 |
EXISTS key [key ...] |
判断Key是否存在 |
KEYS pattern |
显示所有的Key |
DEL key [key ...] |
删除指定的Key |
TYPE key |
获取Key的类型 |
APPEND key value |
追加内容到value |
STRLEN key |
获取字符串Key的长度 |
MGET key [key ...] |
获取多个Key |
MSET key value [key value ...] |
设置多个Key |
INCR key |
自增 |
INCRBY key increment |
指定步长的自增 |
DECR key |
自减 |
DECABY key decrement |
指定步长的自减 |
INCRBYFLOAT key increment |
自增浮点类型 |
[root@redis ~]# redis-cli -h 10.0.0.10
10.0.0.10:6379> set key value [EX seconds] [PX milliseconds] [NX|XX]
10.0.0.10:6379> set mykey RSQ
OK
10.0.0.10:6379> get mykey # 获取key
"RSQ"
10.0.0.10:6379> keys * # 获取当前所有key,生产慎用,相当于遍历整个数据库,若数据过多会影响性能
1) "mykey"
10.0.0.10:6379> EXISTS mykey # 判断某一key是否存在,存在为1,否则为0
(integer) 1
10.0.0.10:6379> EXISTS mykeykey
(integer) 0
10.0.0.10:6379> DEL mykey # 删除key
(integer) 1
10.0.0.10:6379> EXISTS mykey
(integer) 0
10.0.0.10:6379> set mykey RSQ
OK
10.0.0.10:6379> TYPE mykey # 查看key数据类型
String
10.0.0.10:6379> set mykey RSQ
OK
10.0.0.10:6379> APPEND mykey RSQ # 追加key
(integer) 6
10.0.0.10:6379> GET mykey
"RSQRSQ"
10.0.0.10:6379> STRLEN mykey # 查看key长度
(integer) 6
10.0.0.10:6379> INCR num # 自增,用于计数
(integer) 1
10.0.0.10:6379> GET mykey
"RSQRSQ"
10.0.0.10:6379> get num
"1"
10.0.0.10:6379> INCR num
(integer) 2
10.0.0.10:6379> get num
"2"
10.0.0.10:6379> INCR num
(integer) 3
10.0.0.10:6379> INCR num
(integer) 4
10.0.0.10:6379> INCR num
(integer) 5
10.0.0.10:6379> INCR num
(integer) 6
10.0.0.10:6379> get num
"6"
10.0.0.10:6379> INCRBY num 5 # 指定自增步长
(integer) 11
10.0.0.10:6379> get num
"11"
10.0.0.10:6379> DECR num # 自减
(integer) 10
10.0.0.10:6379> DECR num
(integer) 9
10.0.0.10:6379> DECR num
(integer) 8
10.0.0.10:6379> DECR num
(integer) 7
10.0.0.10:6379> get num
"7"
10.0.0.10:6379> DECRBY num 5 # 指定自减步长,支持负数
(integer) 2
10.0.0.10:6379> DECRBY num 5
(integer) -3
10.0.0.10:6379> DECRBY num 5
(integer) -8
10.0.0.10:6379> MSET key1 R1 key2 R2 key3 R3 # 设置多个key
OK
10.0.0.10:6379> keys *
1) "key1"
2) "key3"
3) "mykey"
4) "num"
5) "key2"
10.0.0.10:6379> MGET key1 key2 key3 # 获取多个key
1) "R1"
2) "R2"
3) "R3"
概念:http://redis.cn/topics/data-types.html#hashes
Hash类型的键最多为2^32-1
命令 | 作用 |
---|---|
HSET key field value |
设置hash里面一个字段的值 |
HGET key field |
获取hash中field的值 |
HMSET key field value [field value ...] |
设置多个hash字段值 |
HMGET key field [field ...] |
获取多个hash中field的值 |
HGETALL key |
从hash中读取全部的域和值 |
HDEL key field [field ...] |
删除一个或多个hash中的field |
10.0.0.10:6379> HSET car name BMW # 设置hash值
(integer) 1
10.0.0.10:6379> HSET car price 500
(integer) 1
10.0.0.10:6379> HGET car # 获取键的field域值,不能直接跟键,会报错
(error) ERR wrong number of arguments for 'hget' command
10.0.0.10:6379> HGET car name
"BMW"
10.0.0.10:6379> HGET car price
"500"
10.0.0.10:6379> HMGET car name price
1) "BMW"
2) "500"
10.0.0.10:6379> HSET car price 10000
(integer) 0
10.0.0.10:6379> HGET car price
"10000"
10.0.0.10:6379> HMSET book name flower price 20 # 可以设置多个键的域
OK
10.0.0.10:6379> HMGET book name price #获取多个键的域
1) "flower"
2) "20"
10.0.0.10:6379> HMGET book price name
1) "20"
2) "flower"
10.0.0.10:6379> HGETALL book # 获取一个键的所有fields及values
1) "name"
2) "flower"
3) "price"
4) "20"
10.0.0.10:6379> HDEL car name # 删除键的field
(integer) 1
10.0.0.10:6379> HGETALL car
1) "price"
2) "10000"
10.0.0.10:6379> HEXISTS car price # 查看此hash 键的field是否存在
(integer) 1
10.0.0.10:6379> HEXISTS car name
(integer) 0
概念:http://redis.cn/topics/data-types.html#lists
命令 | 作用 |
---|---|
LPUSH key value [value ...] |
从队列的左边入队一个或多个元素 |
RPUSH key value [value ...] |
从队列的右边入队一个或多个元素 |
LPOP key |
从队列的左边弹出一个元素 |
RPOP key |
从队列的右边弹出一个元素 |
LRANGE key start stop |
从列表中获取指定返回的元素 |
LREM key count value |
从列表中删除元素 |
10.0.0.10:6379> LPUSH list R1
(integer) 1
10.0.0.10:6379> LPUSH list R2
(integer) 2
10.0.0.10:6379> LPUSH list R3
(integer) 3
10.0.0.10:6379> LPUSH list R4
(integer) 4
10.0.0.10:6379> LLEN list
(integer) 4
# 会显示右侧序列为1的到序列为3范围内的,右侧第一的数的序列为0
10.0.0.10:6379> LRANGE list 1 3
1) "R3"
2) "R2"
3) "R1"
# 左右弹出数据
10.0.0.10:6379> LPOP list
"R4"
10.0.0.10:6379> LPOP list
"R3"
10.0.0.10:6379> RPOP list
"R1"
10.0.0.10:6379> RPOP list
"R2"
# 左右push数据
10.0.0.10:6379> LPUSH list 1
(integer) 1
10.0.0.10:6379> LPUSH list 2
(integer) 2
10.0.0.10:6379> RPUSH list 3
(integer) 3
10.0.0.10:6379> RPUSH list 4
(integer) 4
# 此时在此列表中数据从左至右为2134
10.0.0.10:6379> LRANGE list 0 3
1) "2"
2) "1"
3) "3"
4) "4"
10.0.0.10:6379> LINDEX list 0
"2"
10.0.0.10:6379> LINDEX list 1
"1"
10.0.0.10:6379> LINDEX list 2
"3"
10.0.0.10:6379> LINDEX list 3
"4"
10.0.0.10:6379> LINDEX list -1
"4"
10.0.0.10:6379> LINDEX list -2
"3"
10.0.0.10:6379> LINDEX list -3
"1"
10.0.0.10:6379> LINDEX list -4
"2"
值与位置的一一对应关系
k1 | k2 | k3 | k4 |
---|---|---|---|
3 | 2 | 1 | 0 |
-1 | -2 | -3 | -4 |
下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0
表示列表的第一个元素,以 1
表示列表的第二个元素,以此类推。也可以使用负数下标,以 -1
表示列表的最后一个元素, -2
表示列表的倒数第二个元素,以此类推。
概念:http://redis.cn/topics/data-types.html#sets
命令 | 作用 |
---|---|
SADD key member [member ...] |
添加一个或多个元素到集合(set)里 |
SREM key member [member ...] |
|
SMEMBERS key |
获取集合里面的所有元素 |
SDIFF key [key ...] |
获取队列不存在的元素,差集 |
SINTER key [key ...] |
获取两个集合的交集 |
SUNION key [key ...] |
获取两个集合的并集 |
SCARD key |
获取集合里面的元素数量 |
SDIFFSTORE destination key [key ...] |
获得两个集合的差集,并存储在一个关键的结果集 |
SINTERSTORE destination key [key ...] |
获得两个集合的交集,并存储在一个关键的结果集 |
SUNIONSTORE destination key [key ...] |
获得两个集合的并集,并存储在一个关键的结果集 |
10.0.0.10:6379> SADD word1 a # 添加集合数据
(integer) 1
10.0.0.10:6379> SADD word1 a b c
(integer) 2
10.0.0.10:6379> SADD word1 a b c d e
(integer) 2
10.0.0.10:6379> SREM word1 e # 删除集合数据
(integer) 1
10.0.0.10:6379> SMEMBERS word1 # 查看集合数据
1) "c"
2) "a"
3) "b"
4) "d"
10.0.0.10:6379> SISMEMBER word1 b # 判断指定元素是否存在于集合中
(integer) 1
10.0.0.10:6379> SISMEMBER word1 e
(integer) 0
10.0.0.10:6379> SADD word2 1 2 3
(integer) 3
10.0.0.10:6379> SADD word3 2 3 4
(integer) 3
10.0.0.10:6379> SDIFF word2 word3 # 差集
1) "1"
10.0.0.10:6379> SDIFF word3 word2
1) "4"
10.0.0.10:6379> SINTER word2 word3 # 交集
1) "2"
2) "3"
10.0.0.10:6379> SUNION word2 word3 # 并集
1) "1"
2) "2"
3) "3"
4) "4"
10.0.0.10:6379> SCARD word1 # 统计集合中元素的个数
(integer) 4
10.0.0.10:6379>
10.0.0.10:6379> SCARD word2
(integer) 3
10.0.0.10:6379> SCARD word3
(integer) 3
10.0.0.10:6379> SDIFFSTORE haha word2 word3 # 获取两个集合的交集并存储在一个关键集中
(integer) 1
10.0.0.10:6379> TYPE haha
set
10.0.0.10:6379> SCARD haha
(integer) 1
10.0.0.10:6379> SMEMBERS haha
1) "1"
10.0.0.10:6379>
命令 | 作用 |
---|---|
ZADD key [NX|XX] [CH] [INCR] score member [score member ...] |
添加到有序set的一个或多个成员,如果它已经存在会更新分数 |
ZSCORE key member |
获取成员在排序设置相关的比分 |
ZRANGE key start stop [WITHSCORES] |
根据指定的index返回有序集合的成员列表 |
10.0.0.10:6379> ZADD test 1 zhang 2 wang 3 li
(integer) 3
10.0.0.10:6379> ZSCORE test zhang
"1"
10.0.0.10:6379> ZSCORE test wang
"2"
10.0.0.10:6379> ZSCORE test li
"3"
10.0.0.10:6379> ZRANGE test 0 -1 # 0代表第一个,-1代表最后一个,故0 -1能显示全部数据
1) "zhang"
2) "wang"
3) "li"
10.0.0.10:6379> ZRANGE test 2 3
1) "li"
10.0.0.10:6379> ZRANGE test -2 -1
1) "wang"
2) "li"
值与位置对应关系
zhang | wang | li |
---|---|---|
0 | 1 | 2 |
-1 | -2 | -3 |