5:安装redis:参考安装手册
解压:tar -zxvf
编译: make 需要先安装gcc 编译结果:在redis的安装src目录下
,生成redis的一系列可执行文件。
安装: make install 把reids任何安装目录下生成redis的一系列可执行文件拷贝到/usr/local/bin中,在任何目录下都可以执行redis命令。
6:启动redis
1,前台启动 在bin目录下 ./redis-server
2后台启动 在bin目录下 ./redis-server &
3指定配置文件./redis-server /usr/local/redis/redis.conf & 不指定配置文件 配置的文件是不生效的
7:关闭redis服务
1.通过kill、命令
ps -ef | grep redis 查看 pid 然后 kill pid
2:通过 redis-cli命令关闭
8:redis客户端:用来连接redis服务,向redis服务端发送命令,并且来显示redis服务处理结果。
redis-cli:redis自带客户端,使用命令redis-cli就可以启动redis的客户端程序。在bin下面 ./redis-cli 默认连接本机上的6379端口redis服务
连接指定端口的redis ./reids-cli -p 端口 连接本机指定端口的redis
连接指定ip上的redis服务: ./redis-cli -h 192.168.0.1 -p 6379
关闭客户端:执行quit或者exit
9:redis的基本知识
1)测试redis的服务性能: ./redis-benchmark
2)测试redis服务是否正常运行: 在redis-cli 输入ping 正常 返回PONG
3)info 查看redis所有的统计信息
4)redis的数据库实例只能有redis服务创建和维护 作用和mysql的数据库实例类似。 开发人员不能修改和自行创建数据库实例,默认情况下,redis会自动创建16个数据库实例,并且给这些数据库实例进行编号,从0开始,一直到15,使用时通过编号来是用数据库,可以通过配置文件,指定redis自动创建数据库个数,redis的每个数据库实例所占空间很小
5)切换数据库实例:select index index表示数据库的编号
6)查看当前数据库中key的数目:dbsize
7)查看当前实例中所有的key: key *
8)清空当前库的所有key: flushdb
9)清空所有数据库实例数据:flushall
10)查看redis的配置文件: config get * 查看redis中的指定的配置信息 config get parameter
10:Redis的五种数据结构:
程序是用来处理数据的,redis是用来存储数据的,程序处理完的数据要存储到redis中,不同特点的数据要储存在redis中的不同类型的数据结构中:
字符串: 张三 20 true String : 单key 单value username:zhangsan
list列表:139000999 32131 list 单key: 多有序 value
set 集合 set 单key: 多无序 value:city:bj sh cg tj
pojo: hash 单key 对象 student id :0001 name:zhangsan
zset 单key:多有序value
字符串类型string:是redis中最基本的数据结构,它能存储任何类型的数据,包括二进制数据,序列化后的数据,json化的对象甚至是一张图片,最大512M
key:value 如username : 张安和李四
列表类型list:是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部或者尾部,底层是个链表结构。
key:value 如region :北京,上海 天津
集合类型set:是string类型的无序无重复集合
哈希类型hash
有序集合类型zset
11:redis中的操作命令
查看数据库中的key: keys pattern
keys * : 查看数据库中所有的key
keys k* : 获取数据库中所有的以k开头的key
keys h*o :查看数据中所有以h开头、以o结尾的key
keys h?o :查看数据中所有以h开头,以o结尾并且中间只有一个字符的key
keys h[abc]llo : 查看数据库中所有以h开头以llo结尾,并且h后边只能去abc中的一个字符的key
exists key :判断key在数据库中是否存在,如果不存在返回0 存在返回1
exists key [key key] 返回值是存在key的数量
move key index : 移动指定key到指定的数据库实例 move k 1
ttl key: 查看指定key的剩余生存时间:ttl key 如果key 没有设置生成书剑 返回 -1 如果不存在返回-2
ttl k1 ttl k2
expire key seconds :设置key的最大生存时间: expire k2 20
rename key newkey : 重命名key
del key [key key] f返回值是实际删除的key的数量 del k1 k2 k3
12 redis中有关string类型的数据的操作命令:
a>将string类型的数据保存到redis中: set key value
set zsname zhangsan set zsage 20 set totalRows 100
2>获取 get zsname get zsage
3> 追加字符串 append key value
返回值追加之后的字符串的长度
如果key不存在 则新建一个key 并且把value值设置为value
4> 获取字符串数据的长度 strlen key strlen phone
5>将字符串数值加1 incr key
返回加1运算之后的数据
如果key不存在 首先设置一个key 值初始化为0 然后进行incr运算 value必须是数值 否则报错
6>将字符串数值减1 decr key
7>将字符串数值进行加offset运算: incrby key offset incrby key 10
将字符串数值进行减offset运算: decrby key offset decrby key 10
8>获取字符串中的子字符串: getrange key startIndex endIndex 下标从0开始 自左向右
9>用value覆盖下表为startIndex开始的字符串吗,能覆盖多少就覆盖多少:setrange key startIndex value
setrange zsname 5 xiaosan
setrange zsname 5 lao
10>设置字符串数据的同时,设置它最大生命周期:setex key seconds value
setex k1 20 v1
11>设置string类型的数据value到redis数据库中,当key不存在则设置成功,当key不存在放弃设置
setnx key value setnx zsage 20
12>批量将string类型的数据设置到redis中,: mset k1 v1 k2 v2
13>批量从redis中获取string类型的数据: mget k1 k2
14>批量设置string类型的value到redis数据库中,只要有一个key存全部放弃
msetnx v1 v2 v3
13:redis中有关list类型数据的操作命令 单key —— 多value并且有序 从左到右 从0开始 每一个元素都有下标 表头元素的下标识0 依次往后排序,最后一个元素下表是列表长度-1 每一个元素的下标可以用负数表示 ,负下标表示从表尾计算 最后一个元素的下标用-1表示
元素在列表中的顺序或者下标由放入的顺序来决定
1>将一个或者多个值依次掺入到列表的表头:lpush key value value value
lpush list01 1 2 3 4 5
2>获取指定列表中的元素:lrange key startIndex endIndex
lrange list01 1 2 结果 4 3
lrange list01 1 -2 结果 4 3 2
lrange list01 0 -1 结果 5 4 3 2 1
3>将一个或者多个值依次插入到列表的表尾(右侧):rpush key value [value value]
rpush list02 a b c 结果: a b c
rpush list02 d e 结果 a b c d e
lpush list02 m n 结果 n m a b c d e
4>从指定列表中移除并且返回表头元素: lpop key
lpop list02
5>从指定列表中移除并且返回表尾元素: rpop key
rpop list02
6>获取指定列表中指定下表的元素:lindex key index
lindex list02 3 结果 d
7>获取指定列表的长度: llen key
llen list02 结果 4
8>根据count值移除指定列表中跟value相等的数据: lrem key count value 如果count>0 从列表的左侧 移除count个跟value相等的数据
如果count<0 从列表的右侧,移除count个跟value相等的数据
lpush list03 a a b c a d e a b b 结果: b b a e d a c b a a
lrem list03 2 a 结果:b b e d c b a a
lrem list03 -2 a 结果:b b e d c b
9>截取指定列表中指定下标区间的元素组成新的列表,并且赋值给key: ltrim key startIndex endIndex
lpush list04 1 2 3 4 5 结果 5 4 3 2 1
ltrim list04 1 3
lrange list04 0 -1 结果 4 3 2
10>将指定列表中指定下标的元素设置为指定值: lset key index value
lset list 1 10 结果 4 10 2
11>将value插入到指定列表中位于pivot 元素之前/之后的位置: linsert key before/after pivot value
linsert list04 before 10 50
linsert list04 after 10 60
14:redis有关set类型数据的操作命令:单key -多无序value 一个key对应多个value; value之间没有顺序 并且不能重复,通过业务数据直接操作集合
1>将一个或者多个元素添加到指定的集合中: sadd key value value
sadd set01 a b c a 结果 a b c
sadd set01 b d e 结果 a b c d e
2>获取指定集合中所有的元素 smembers key
smembers set01
3>判断指定元素在指定集合中是否存在:sismember key member
存在 返回 1
不存在 返回0
sismember set01 f
sismember set01 a
4>获取指定集合的长度 scard key
scard set01
5>移除指定集合中一个或者多个元素 srem key member
不存在的元素会被忽略
返回成功 成功移除的个数
srem set01 b d m
6>随机获取指定集合中的一个或者多个元素 srandmember key count
sadd set02 1 2 3 4 5 6 7 8 9
srandmember set02
srandmember set02 3
srandmember set02 -3
7>从指定集合中随机移除一个或者多个元素 spop key [count]
spop set02
8>将指定集合中的指定元素移动到另一个元素: smove source dest member
smove set01 set02 a
9>获取一个集中有、但是其他集合中都没有的元素组成的新集合: sdiff key key
sdiff set01 set02
10>获取所有指定集合中都有的元素组成的新集合 sinter key key
sinter set01 set02
11>获取所有指定集合中所有元素祖成的大集合: sunion key key
sunion set01 set02
15:redis中有关hash类型数据的操作命令 单key field -value field-value
field 是域
1>将一个或者多个field-value对设置到哈希表中 hset key field1 value1
hset stu1001 id 1001
hset stu1001 name zhangsan age 20
2>获取指定哈希表中指定field的值 hget key field
3>批量将多个field-value对设置到哈希表中:hmset key field1 value1 [field2 value2]
hmset stu1002 id 1002 name lisi age 20
4>批量获取指定哈希表的field的值 hmget key field1 [field3 field3]
hmget stu1001 id name age
5>获取指定哈希表中所有的field和value: hgetall key
hgetall stu1001
6>从指定hash表中删除一个或者多个field: hdel key field1 field2
hdel stu1001 age name
7>获取指定hash表中所有的field个数 hlen key
hlen stu1001
8>判断指定哈希表中是否存在某一个field: hexists key field
hexists stu1001 id
hexists stu1001 name
9>获取指定哈希表中所有的field列表:hkeys key
hkeys stu1001
10>获取hash中所有的value列表: hvals key
hvals stu1001
11>对指定hash中指定field值进行加法运算 hincrby key field int
hincrby stu1001 age 5
12>对指定hash中指定field进行浮点数运算 hincrbyfloat key field float
hincrbyfloat stu1001 score 80.4
13>将一个field-value对设置到hash中,当key-field 已经存在时,则放弃设置,否则设置成功 hsetnx key value
hsetnx stu1001 age 30
16:redis中有关zset类型的操作命令: 有序集合 元素不能重复 每一个元素都关联一个分数 分数可以重复
redis会根据分数对元素进行排序
1>将一个或者多个元素member 及其分数score值 加入有序集合:zadd key score member
zadd zset01 1 z1 2 z2 4 z3 5 z4 10 z5 8 z6
如果元素存在 则覆盖掉
2>获取指定zset 中 指定下标区间的元素 : zrange key startIndex endIndex [withsocres]
zrange zset01 0 -1
zrange zset01 0 -1 withsocres
3>获取指定有序集合中指定分数区间的元素 : zrangebyscore key min max [withsocres]
zrangebyscore zset01 3 5 withsocres
4>删除指定zset中一个或者多个元素: zrem key member
zrem zset01 z3 z4
5>获取指定有序集合中所有元素的个数:zcard key
zcard zset01
6>获取zset集合指定元素的排名 zrank key member
zrank zset01 z4
7>获取指定zset中分数在指定区间内的元素的个数:zcount key min max
zcount zset01 3 5
8>获取zset中指定元素的分数: zscore key member
zscore zset01 z4
9>获取有序集合中指定元素的排名(反向从大到小):zrevrank key member
zrevrank zset04 z4
17:redis的配置文件:在redis根目录下提供redis.conf配置文件 可以配置一些redis服务端运行时的一些参数
如果不使用配置文件 那么redis就按照默认的参数运行
如果使用配置文件,在启动redis服务时必须指定使用的配置文件
1>redis配置文件观摩网络的配置 :
port : 指定redis服务所用的端口 默认6379
bind: 配置客户端连接redis服务时,所能使用的ip地址,默认可以使用redis服务所在主机上任何一个ip都可以使用,
一般情况下 都会配置一个ip
如果配置了 ip和port 那么客户端在启动的时候必须制定端口和ip
./redis-cli -h 192.168.0.1 -p 6380
./redis-cli -h 192.168.0.1 -p 6380 shutdown
2>redis的常规配置
databases: 配置redis服务默认创建的数据库实例个数 默认值 16
requirepass: 配置redis密码 此参数必须在protected-mode=yes时才能起作用
./redic-cli -h ip -p port -a pwd
3>redis的持久化
当redis所在服务器发生宕机后,redis数据库里面的数据就会全部丢失,redis提供了RDB和AOF进行持久化
rdb策略;在指定的时间间隔内,redis服务执行指定次数的写操作,会自动触发一次出持久化操作。
默认的策略 1分钟改了一万次或者 5分钟改了10次 或者15分钟改了1次
AOF策略:采用操作日志的来记录每一次写操作的命令,每次redis服务启动时,都会重新执行一遍操作日志中的指令。
效率低下 默认不开启AOf
小结:根据数据的特点决定开启哪种持久化策略:一般情况下 开启rdb就够了,
18:redis的事务
事务:把一组数据库操作放在一起执行,保证操作原子性,要么同时失败 ,要么同时成功。
redis的事务:允许把一组redis命令放在一起执行,把命令进行序列化,然后一起执行,保证部分原子性,
1>multi:用来标记一个事务的开始,
multi
set k1 v1
set k2 v2
2>用来执行事务队列中所有的命令
exec
3>redis的事务 只能保证部分原子性
a>如果一组命令中,有在压入事务队列过程中发生草屋的命令,则本事务所有的命令都不执行,能够保证事务的原子性,
b>如果一组命令中,在压入队列过程中正常,但是在执行事务队列命令时发生了错误,则只影响发生错误的命令,不会影响
其他命令的执行,不能够保证事务的原子性。
4>discard:放弃压入队列的事务命令 并且结束整个事务
5>watch: 监控某一个键,当事务在执行过程中,此键代码的值发生变化,则本事务放弃执行。
watch version
multi
decry balance 50
incrby balance 60
exec
6>unwatch : 放弃监控所有的键。
unwatch version
multi
decry balance 50
incrby balance 60
exec
19:redis的消息发布与订阅
redis客户端订阅频道,消息的发布者向频道上发布消息,所有订阅此频道的客户端都能接受到消息
a>subscribe: 订阅一个或者多个频道信息
subscribe ch1 ch2 ch3
b>publish: 将消息发布到指定频道
publish ch1 hello
c>psubscribe: 订阅一个或者多个频道的消息,频道名支持通配符
psubscribe news.*
20>redis的主从复制:
主机数据更新后根据配置和侧坐,自动同步到丛机的master/slave 机制,master以写为主 slave 以读为主
主少从多,主写从读,读写分类,主写同步复制到从
a> 搭建三台redis服务,使用一个redis模拟三台redis服务
提供三分redis配置文件 redis6379.conf, redis6380.conf ,redis6381.conf
修改对应的 port 6379
pidfile /var/run/redis_6379.pid
logfile '6379.log'
dbfilename dump6379.rdb
bind 127.0.0.1
./redis-service /usr/local/redis/redis6379.conf &
启动三台redis
b>通过redis 客户端分别连接三台服务器
./redis-cli -p 6379 ./redis-cli -p 6380 ./redis-cli -p 6381
c>查看三台redis服务在集群中的主从角色:
info replication
默认情况下,所有的redis服务都是主机,即都能写和读,但是都没有丛机
d>在6379上写操作 set k1 v1 三台redis服务互相独立,互不影响
e>设置主从关系,设从不设主
在6380上执行,slaveof 127.0.0.1 6379 如何设置密码 从机上需要配置 masterauth xxx 主机密码
不然master_link_status:down 表示连接主机失败
f>全量复制:一旦主从关系确认,会自动把主机上已有的数据同步复制到从库,
在6380和6381上执行,keys *
g>增量复制:主库写数据会自动同步到从库
h> 主写从读,读写分离
i>主机宕机:从机原机待命 可以读 关闭 6379 服务
j> 从机宕机: 主机少一个从机 ,其它从机不变 从机回复 需要从新设置主从关系
k>从机上位: 主机宕机 选一个从机断开原来主从关系 slaveof no one 从前的主机恢复 变成一个 孤家寡人 然后 6379 从机于6380
6381 即是主机也是从机
一台主机配置多台从机 一台从机 又可以配置多台从机,从而形成一个庞大的集群结构 ,减轻一台主机的压力,但是增加了服务间的延迟时间。
21>redis哨兵模式:主机宕机,从机上位的自动版。
a>搭建三台redis服务:使用一个redis模拟三台redis服务
搭建一主二从集群架构,
b>提供哨兵配置文件 在redis安装目录下创建配置文件: redis_sentinel.conf
并编辑里边的内容" sentinel monitor dc-redis 127.0.0.1 6379 1 表示 指定监控主机的ip 端口 得到哨兵的投票数
c>启动哨兵服务:redis-sentinel redis_sentinel.conf