下载安装
下载地址:
$ wget http://redis.googlecode.com/files/redis-2.6.13.tar.gz
linux下:
解压到指定目录
make 32bit / make
make install prefix=/usr/local/redis
安装成功
windows免安装:
参数介绍:
make install命令执行完成后,会在/usr/local/bin目录下生成本个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-check-aof 、redis-check-dump,它们的作用如下:
redis-server:Redis服务器的daemon启动程序
redis-cli:Redis命令行操作工具。也可以用telnet根据其纯文本协议来操作
redis-benchmark:Redis性能测试工具,测试Redis在当前系统下的读写性能
redis-check-aof:数据修复
redis-check-dump:检查导出工具
redis的配置文件
daemonize yes //以后进程的方式运行
pidfile /home/{用户目录}/redis/var/redis.pid //进程号
port 6379 //端口号
timeout 300 //服务超时时间
loglevel debug
logfile /home//{用户目录}/redis/var/redis.log
databases 16
dbfilename dump.rdb
dir /home/work/redis/var
启动
启动服务器:
./redis-server
启动客户端:
./redis-cli #默认连接本机,6379端口
./redis-cli -h IP -p PORT #指定主机和端口连接
windwos下直接双击对应的问价就可以
redis基本操作
基本类型
设置值
redis 127.0.0.1:6379> setex age 10 100 #设置age=100 时间是10s
OK
获取值
redis 127.0.0.1:6379> get age#获取age的值
(nil)
redis 127.0.0.1:6379> get age
(nil)
redis 127.0.0.1:6379> setex age 10 100
OK
redis 127.0.0.1:6379> get age#获取age的值
"100"
redis 127.0.0.1:6379> setex age 100 100
OK
查询值剩余有效时间
redis 127.0.0.1:6379> ttl age #查询剩余有效时间
(integer) 96
查看值得类型
redis 127.0.0.1:6379> type age
string
redis 127.0.0.1:6379> setex nage 10 "rolin"
OK
redis 127.0.0.1:6379> type nage
string
新存放一个列表进去
redis 127.0.0.1:6379> lpush mylist 1 2 3 4 #存放一个list,没有指定存放时间,永久有效
(integer) 4
redis 127.0.0.1:6379> type mylist
list
查看当前库下的有效的key值
redis 127.0.0.1:6379> keys *
1) "mylist"
切换数据库,redis默认有16个库,分别是0-15,默认选择的0号库
redis 127.0.0.1:6379> select 1
OK
redis 127.0.0.1:6379[1]> keys *
(empty list or set)
redis 127.0.0.1:6379[1]> select 0
OK
redis 127.0.0.1:6379> keys *
1) "mylist"
redis 127.0.0.1:6379[1]> select 0
OK
redis 127.0.0.1:6379> keys *
1) "mylist"
redis 127.0.0.1:6379> keys *
1) "mylist"
把key移动到1号库下面去
redis 127.0.0.1:6379> move mylist 1
(integer) 1
redis 127.0.0.1:6379> keys *
(empty list or set)
redis 127.0.0.1:6379> select 1
OK
redis 127.0.0.1:6379[1]> keys *
1) "mylist"
redis 127.0.0.1:6379[1]> set name rolings
OK
redis 127.0.0.1:6379[1]> get name
"rolings"
redis 127.0.0.1:6379[1]> set age 23
OK
一次获取多个值
redis 127.0.0.1:6379[1]> mget name age
1) "rolings"
2) "23"
redis 127.0.0.1:6379[1]> append name _youling
(integer) 15
redis 127.0.0.1:6379[1]> get name
"rolings_youling"
删除所有的;
redis 127.0.0.1:6379[1]> flushdb
OK
redis 127.0.0.1:6379[1]> keys *
(empty list or set)
一次性设置多个值
redis 127.0.0.1:6379[1]> mset name rolin age 25
OK
redis 127.0.0.1:6379[1]> keys *
1) "name"
2) "age"
redis 127.0.0.1:6379[1]> get count
"2"
原子性操作,支持并发安全的计数器
redis 127.0.0.1:6379[1]> incr count
(integer) 3
redis 127.0.0.1:6379[1]> get count
"3"
增长指定的数值
redis 127.0.0.1:6379> incrby age 3
(integer) 4
redis 127.0.0.1:6379> decr age
(integer) 3
redis 127.0.0.1:6379> get age
"3"
redis 127.0.0.1:6379> decrby age 2
(integer) 1
redis 127.0.0.1:6379> get age
"1"
redis 127.0.0.1:6379> get aaa
(nil)
对于不存在的值,从0开始减小
redis 127.0.0.1:6379> decr aaa
(integer) -1
redis 127.0.0.1:6379> get age
"1"
redis 127.0.0.1:6379> set age 2
OK
防止覆盖,如果存在就不覆盖
redis 127.0.0.1:6379> setnx age 3
(integer) 0
redis 127.0.0.1:6379> get age
"2"
指定缓存时间:10是时间,19是值
redis 127.0.0.1:6379> setex count 10 19
OK
redis 127.0.0.1:6379> get count
"19"
redis 127.0.0.1:6379> get count
(nil)
字符串操作
redis 127.0.0.1:6379> set name 'rolin'
OK
求字符串的长度
redis 127.0.0.1:6379> strlen name
(integer) 5
截取字符串,数值是角标
redis 127.0.0.1:6379> getrange name 0 3
"roli"
截取整个字符串的长度
redis 127.0.0.1:6379> getrange name 0 -1
"rolin"
map集合
redis 127.0.0.1:6379> hset 001 name rolin #001是大的key,name是小的key,rolin是小key的值
(integer) 1
redis 127.0.0.1:6379> hset 001 gender man#设置第二个小key
(integer) 1
redis 127.0.0.1:6379> hset 002 name legend
(integer) 1
redis 127.0.0.1:6379> hset 002 gender woman
(integer) 1
redis 127.0.0.1:6379> hget 001 name #得到大key 001下,小key name的值
"rolin"
redis 127.0.0.1:6379> hget 001 gender
"man"
redis 127.0.0.1:6379> hgetall 001 #得到大key下001的所有小key的值
1) "name"
2) "rolin"
3) "gender"
4) "man"
redis 127.0.0.1:6379> hgetall 002
1) "name"
2) "legend"
3) "gender"
4) "woman"
redis 127.0.0.1:6379> hdel 001 gender #删除小key以及对应的值
(integer) 1
redis 127.0.0.1:6379> hgetall 001
1) "name"
2) "rolin"
redis 127.0.0.1:6379> del 001 #删除大key,以及他下面的所有的小key以及对应的值
(integer) 1
redis 127.0.0.1:6379> hgetall 001
(empty list or set)
redis 127.0.0.1:6379> hkeys key
(empty list or set)
redis 127.0.0.1:6379> hkeys 001 #查看大key 001下所有的小key
(empty list or set)
redis 127.0.0.1:6379> hkeys 002
1) "name"
2) "gender"
redis 127.0.0.1:6379> hset 001 age 1
(integer) 1
redis 127.0.0.1:6379> hincrby 001 age
(error) ERR wrong number of arguments for 'hincrby' command
原子性增长,必须指定每次增长的数值的大小
redis 127.0.0.1:6379> hincrby 001 age 1
(integer) 2
redis 127.0.0.1:6379> hincrby 001 age 10
(integer) 12
其他的map的操作的方法,请参考传智播客的ppt
list集合
redis 127.0.0.1:6379> lpush mylist 0 1 2 3 4 5 6
(integer) 7
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
7) "0"
redis 127.0.0.1:6379> rpush mylist1 0 1 2 3 4 5 6
(integer) 14
redis 127.0.0.1:6379> lrange mylist1 0 -1
1) "0"
2) "1"
3) "2"
4) "3"
5) "4"
6) "5"
7) "6"
redis 127.0.0.1:6379> lpop mylist
"6"
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
6) "0"
redis 127.0.0.1:6379> rpop mylist
"0"
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
阻塞等待获取左边的值,如果有就拿到,如果没有就等待,100是等待的时间,单位是秒
redis 127.0.0.1:6379> blpop mylist3 100 #等待中.........
新开一个cli,
redis 127.0.0.1:6379> lpush mylist3 10 20 #push值进去
(integer) 2
上面等待的cli输出
1) "mylist3"
2) "20"
(15.56s) #一共等待时间
#从右侧弹栈
redis 127.0.0.1:6379> brpop mylist3 10
1) "mylist3"
2) "10"
redis 127.0.0.1:6379> lpush mylist 1 2 3 4 5 5 5 5 4
(integer) 9
redis 127.0.0.1:6379> lrange mylist
(error) ERR wrong number of arguments for 'lrange' command
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "4"
2) "5"
3) "5"
4) "5"
5) "5"
6) "4"
7) "3"
8) "2"
9) "1"
从开始的位置开始删除前两次出现的值为5的元素
redis 127.0.0.1:6379> lrem mylist 2 5
(integer) 2
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "4"
2) "5"
3) "5"
4) "4"
5) "3"
6) "2"
7) "1"
从左侧开始修改0角标的值为5
redis 127.0.0.1:6379> lset mylist 0 5
OK
显示指定范围的值
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "5"
2) "5"
3) "5"
4) "4"
5) "3"
6) "2"
7) "1"
redis 127.0.0.1:6379> llen mylist
(integer) 7
redis 127.0.0.1:6379> ltrim mylist 3 -1
OK
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
redis 127.0.0.1:6379> ltrim mylist 0 4
OK
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
对list进行截取
redis 127.0.0.1:6379> ltrim mylist 0 3
OK
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
对list进行截取
redis 127.0.0.1:6379> ltrim mylist 0 2
OK
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "4"
2) "3"
3) "2"
获取指定角标的值
redis 127.0.0.1:6379> lindex mylist 1
"3"
没有插入成功
redis 127.0.0.1:6379> linsert mylist before 0 5
(integer) -1
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "4"
2) "3"
3) "2"
在第一个值为4的后面插入5
redis 127.0.0.1:6379> linsert mylist before 4 5
(integer) 4
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
redis 127.0.0.1:6379> linsert mylist before 5 4
(integer) 5
redis 127.0.0.1:6379> linsert mylist before 4 5
(integer) 6
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "5"
2) "4"
3) "5"
4) "4"
5) "3"
6) "2"
在第一个值为4后面插入6
redis 127.0.0.1:6379> linsert mylist after 4 6
(integer) 7
redis 127.0.0.1:6379> lrange mylist 0 -1
1) "5"
2) "4"
3) "6"
4) "5"
5) "4"
6) "3"
7) "2"
set集合
创建一个set集合
redis 127.0.0.1:6379> sadd myset 1 2 3 4
(integer) 4
redis 127.0.0.1:6379> type myset
set
添加一个重复值,返回添加成功个数为0
redis 127.0.0.1:6379> sadd myset 2
(integer) 0
显示所有的元素
redis 127.0.0.1:6379> smembers myset
1) "1"
2) "2"
3) "3"
4) "4"
redis 127.0.0.1:6379> sadd myset 5
(integer) 1
redis 127.0.0.1:6379> smembers myset
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
redis 127.0.0.1:6379> sadd myset 5
(integer) 0
redis 127.0.0.1:6379> smembers myset
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
弹栈,弹出排序后第一个元素
redis 127.0.0.1:6379> spop myset
"1"
redis 127.0.0.1:6379> smembers myset
1) "2"
2) "3"
3) "4"
4) "5"
判断是否存在该元素
redis 127.0.0.1:6379> sismember myset 4
(integer) 1 存在
redis 127.0.0.1:6379> sismember myset 6
(integer) 0 不存在
redis 127.0.0.1:6379> srandmember myset
"4"
redis 127.0.0.1:6379> smembers myset
1) "2"
2) "3"
3) "4"
4) "5"
随机去set集合中一个元素
redis 127.0.0.1:6379> srandmember myset
"4"
redis 127.0.0.1:6379> srandmember myset
"3"
redis 127.0.0.1:6379> srandmember myset
"5"
求set集合的长度
redis 127.0.0.1:6379> scard myset
(integer) 4
redis 127.0.0.1:6379> sadd myset1 1 2 3 6 7
(integer) 5
redis 127.0.0.1:6379> smembers myset1
1) "1"
2) "2"
3) "3"
4) "6"
5) "7"
求第一个集合和第二个集合的差集,第一个有第二个没有的元素
redis 127.0.0.1:6379> sdiff myset myset1
1) "4"
2) "5"
redis 127.0.0.1:6379> sdiff myset1 myset
1) "6"
2) "7"
求两个集合的交集
redis 127.0.0.1:6379> sinter myset myset1
1) "1"
2) "2"
3) "3"
求两个集合的并集
redis 127.0.0.1:6379> sunion myset myset1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
redis 127.0.0.1:6379> smembers myset
1) "1"
2) "2"
3) "3"
4) "6"
5) "7"
redis 127.0.0.1:6379> smembers myset1
1) "1"
2) "2"
3) "3"
4) "6"
5) "7"
redis 127.0.0.1:6379> sadd myset 8 9
(integer) 2
redis 127.0.0.1:6379> smembers myset
1) "1"
2) "2"
3) "3"
4) "6"
5) "7"
6) "8"
7) "9"
求两个集合的交集,并且把结果存到uset2集合里面去
redis 127.0.0.1:6379> sunionstore uset2 myset myset1
(integer) 7
redis 127.0.0.1:6379> smembers uset2
1) "1"
2) "2"
3) "3"
4) "6"
5) "7"
6) "8"
7) "9"
zset有序集合
创建有序集合
redis 127.0.0.1:6379> zadd zset1 1 one 2 two 3 three
(integer) 3
求有序集合的长度
redis 127.0.0.1:6379> zcard zset1
(integer) 3
redis 127.0.0.1:6379> zadd zset1 4 four
(integer) 1
redis 127.0.0.1:6379> zcard zset1
(integer) 4
查指定角标范围的集合值
redis 127.0.0.1:6379> zrange zset1 1 1
1) "two"
redis 127.0.0.1:6379> zrange zset1 1 2
1) "two"
2) "three"
redis 127.0.0.1:6379> zrange zset1 0 2
1) "one"
2) "two"
3) "three"
查询权重值为1-1之间的值得个数
redis 127.0.0.1:6379> zcount zset1 1 1
(integer) 1
redis 127.0.0.1:6379> zadd zset1 1 one1
(integer) 1
查询权重值为1-1之间的值得个数,由于又添加了一个权重为1的值,所以会有2个
redis 127.0.0.1:6379> zcount zset1 1 1
(integer) 2
查询权重值为1-2之间的值得个数
redis 127.0.0.1:6379> zcount zset1 1 2
(integer) 3
redis 127.0.0.1:6379> zrange zset1 0 4
1) "one"
2) "one1"
3) "two"
4) "three"
5) "four"
取范围之,并且拿到评分
redis 127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "one"
2) "1"
3) "one1"
4) "1"
5) "two"
6) "2"
7) "three"
8) "3"
9) "four"
10) "4"
redis 127.0.0.1:6379> zincrby zset1 1 one
"2"
redis 127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "one1"
2) "1"
3) "one"
4) "2"
5) "two"
6) "2"
7) "three"
8) "3"
9) "four"
10) "4"
指定set集合元素的权重数值增长指定的数值,其中2是增长分数,one是元素
redis 127.0.0.1:6379> zincrby zset1 2 one
"4"
redis 127.0.0.1:6379> zrange zset1 0 -1 withscores
1) "one1"
2) "1"
3) "two"
4) "2"
5) "three"
6) "3"
7) "four"
8) "4"
9) "one"
10) "4"
事务操作
redis 127.0.0.1:6379> multi #开启事务
OK
redis 127.0.0.1:6379> incr age
QUEUED
redis 127.0.0.1:6379> exec #提交事务
1) (integer) 102 #提交成功的时候会有提交的值
redis 127.0.0.1:6379> set age 1
OK
redis 127.0.0.1:6379> multi #开启事务
OK
redis 127.0.0.1:6379> set age 30
QUEUED
redis 127.0.0.1:6379> get age
QUEUED
redis 127.0.0.1:6379> discard #事务回滚
OK
redis 127.0.0.1:6379> get age
"1"
乐观锁:
第一个cli
redis 127.0.0.1:6379> get age
"1"
redis 127.0.0.1:6379> watch age
OK
redis 127.0.0.1:6379> multi #开启事务
OK
redis 127.0.0.1:6379> set age 4
QUEUED
第二个cli
redis 127.0.0.1:6379> set age 2
OK #ok可以修改age的值
redis 127.0.0.1:6379> set age 10
OK
第一个cli
redis 127.0.0.1:6379> exec
(nil) #可见,事务提交是失败的
redis 127.0.0.1:6379> get age
"10" #得到的是第二个cli提交的值
悲观锁
存储数据到磁盘
Redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化。
redis支持两种持久化方式:
RDB Snapshotting(快照),redis默认方式;
Append-only file(缩写aof)的方式。
RDB
RDB快照是默认的持久化方式。Rdb的主要原理就是在某个时间点把内存中的所有数据的快照保存一份到磁盘上。
手动持久化:
save
bgsave
自动持久化配置
save <seconds> <changes>
示例:
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
rdbcompression yes/no #对快照文件进行压缩
dbfilename <文件名> #快照文件名
dir ./ <目录名> #快照文件保存目录
配置:
################################ SNAPSHOTTING #################################
#
# Save the DB on disk:
#指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。
#900秒(15分钟)内至少有1个key被改变
save 900 1
#300秒(5分钟)内至少有10个key被改变
save 300 10
#60秒内至少有10000个key被改变
save 60 10000
#存储至本地数据库时是否压缩数据,默认为yes
rdbcompression yes
#本地数据库文件名,默认值为dump.rdb
dbfilename dump.rdb
#本地数据库存放路径,默认值为 ./
dir d:/redis/var
##当snapshot时出现错误无法继续时,是否阻塞客户端“变更操作”,“错误”可能因为磁盘已满/磁盘故障/OS级别异常等
stop-writes-on-bgsave-error yes
优点:
文件紧凑;
非常适用于灾难恢复;
性能比较好;
恢复速度快;
缺点
在快照时,如果数据量大里,会有停顿感;
如果系统崩溃,会有数据丢失;
AOF:
AOF 比快照方式有更好的持久化性,是由于在使用aof持久化方式时,redis 会将每一个收到的写命令都通过write函数追加到文件中(默认是appendonly.aof)。
AOF配置:
appendonly yes //启用aof持久化方式
appendfsync always //收到写命令就立即写入磁盘,最慢,但是保证完全的持久化
appendfsync everysec //每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中
appendfsync no //完全依赖os,性能最好,持久化没保证
aof 文件位置配置
appendfilename <aof文件路径>
优点
数据更安全;
采用增量追加的方式写文件;
文件可以重写;
文件的可读性比较好。
缺点
AOF文件比RDB文件大;
根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB;
AOF文件恢复较慢;
服务器可能在程序正在对 AOF 文件进行写入时停机, 如果停机造成了 AOF 文件出错(corrupt), 那么 Redis 在重启时会拒绝载入这个 AOF 文件, 从而确保数据的一致性不会被破坏。
文件修复命令:
redis-check-aof –fix <文件名>
注意: 修复文件前,需要对文件进行备份
重写AOF
AOF 的运作方式是不断地将命令追加到文件的末尾, 所以随着写入命令的不断增加, AOF 文件的体积也会变得越来越大。
手动重写AOF文件
bgrewriteaof
丢弃中间结果,保留最后的结果
自动化重写:
auto-aof-rewrite-percentage 100
当前写入日志文件的大小占到初始日志文件大小的某个百分比时触发Rewrite
auto-aof-rewrite-min-size 64mb
本次Rewrite最小的写入数据量
故障恢复
当redis服务器挂掉时,重启时将按以下优先级恢复数据到内存中:
如果只配置了AOF,重启时加载AOF文件恢复数据;
如果同时配置了RBD和AOF,启动时只加载AOF文件恢复数据;
如果只配置了RDB,启动时将加载dump文件恢复数据;
从cli输入命令shutdown 就会关闭redis-server
恢复的命令
./redis-server ./conf/redis.conf
指定配置文件即可自动恢复
主从复制
-------------