乌班图系统下 Redis安装及配置
step1:wget http://download.redis.io/releases/redis-4.0.9.tar.gz 下载
step2:tar xzf redis-4.0.9.tar.gz 解压
step3:sudo mv ./redis-4.0.9 /usr/local/redis/ 移动文件
step4:cd /usr/local/redis/ 进入Redis目录
step5:sudo make 生成
step6:sudo make test 测试
step7:sudo make install 安装
Redis配置:
1.绑定ip:如果需要远程访问,可将此⾏注释,或绑定⼀个真实ip
bind 127.0.0.1 port 6379
- 如果以守护进程运⾏,则不会在命令⾏阻塞,类似于服务
如果以⾮守护进程运⾏,则当前终端被阻塞
设置为yes表示守护进程,设置为no表示⾮守护进程
推荐设置为yes
3.数据文件存储路径:dir /var/lib/redis
4.日志文件:logfile “/var/log/redis/redis-server.log”
5.数据库;database 16
6.主从配置:slaveof
服务端命令:
可以使用:redis-server --help来查看命令帮助
个人习惯:ps aux | grep redis 查看redis服务器进程
sudo kill -9 pid 杀死redis服务器
sudo redis-server /etc/redis/redis.conf 指定加载的配置文件
客户端命令:
1.客户端的命令为redis-cli
2.可以使⽤help查看帮助⽂档 redis-cli --help
3.连接redis redis-cli
4.运行测试:运⾏测试命 ping
5.数据库没有名称,默认有16个,通过0-15来标识,连接redis默认选择第一个数据库,启动时候需要选择数据库: select 1
Redis数据库的基本操作
Redis数据库的操作类型主要是:保存,修改,删除,获取
redis是key-value的数据结构,每条数据都是⼀个键值对
键的类型是字符串
注意:键不能重复
Redis值的数据类型分为以下几种:
1.string:字符串类型是 Redis 中最为基础的数据存储类型,它在 Redis 中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。在Redis中字符串类型的Value最多可以容纳的数据长度是512M。
2.hash:用于存储对象,对象的结构为属性、值,值类型为string
3.list:列表的元素类型为string
4.set:无序集合,元素为string类型,元素具有唯一性,不重复,对集合没有修改权限
5.zset:有序集合,元素为string类型,元素具有唯一性,不重复,对集合没有修改权限
string操作:
1.set:如果设置的键不存在则为添加,如果设置的键已经存在则修改
用法:set key value
set name python
2.setx:设置键值及过期时间,以秒为单位
用法:setex key seconds value
setex name 3 aa
3.mset:一次性设置多个键值对
用法:mset key1 value1 key2 value2 .
mset name python a2 java a3 c
4.append:追加值
用法:append key value,注意append使用时键值都需要加引号
append 'name' 'GO'
5.get:获取:根据键获取值,如果不存在此键则返回nil
get 'name'
6.mget:根据多个键一次性获取多个值
mget name age sex
常用的键命令
1.查看所有键
keys *
2.查看名称中包含a的键
keys a*
3.判断键a1是否存在
exists a1
4.查看键对应的value的类型
type a1
5.删除键及对应的值
del a1 a2
6.设置过期时间,以秒为单位,如果没有指定过期时间则⼀直存在,直到使⽤DEL移除
expire 'a1' 3 #和setx用法区别:setx是设置某个键中指定值的过期时间,而expire是设置整个键的过期时间
6.查看有效时间,以秒为单位
ttl name
hash:
hash⽤于存储对象,对象的结构为属性、值
值的类型为string
1.设置键 user的属性name为python
haset name python
2.设置键user的属性name为pythont、属性age为11
hmset user name python age 11
3.获取键user的所有属性
hkeys user
4.获取键user属性’name’的值
hget user 'name'
5.获取键user属性’name’、'age的值
hmget user 'name' 'age'
6.获取键’user’所有属性的值
hvals user
删除整个hash键及值,使⽤del命令
删除属性,属性对应的值会被⼀起删除
7.删除键’u2’的属性’age’
hdel user age
list:
列表的元素类型为string
按照插⼊顺序排序
1.lpush 在左侧插⼊数据
lpush li a b c
2.rpush 从键为’a1’的列表右侧加⼊数据0 1
rpush a1 a b c
3.linsert 在键为’a1’的列表中元素’b’前加⼊’3’
linsert a1 before b 3
4.lrange 返回列表⾥指定范围内的元素
start、stop为元素的下标索引
索引从左侧开始,第⼀个元素为0
索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
获取键为’a1’的列表所有元素
lrange a1 0 -1
5.lset 设置指定索引位置的元素值
索引从左侧开始,第⼀个元素为0
索引可以是负数,表示尾部开始计数,如-1表示最后⼀个元素
修改键为’a1’的列表中下标为1的元素值为’z’
lset a1 1 z
6.lrem 删除指定元素
将列表中前count次出现的值为value的元素移除
count > 0: 从头往尾移除
count < 0: 从尾往头移除
count = 0: 移除所有
向列表’a2’中加⼊元素’a’、‘b’、‘a’、‘b’、‘a’、‘b’
rpush a2 a b a b a b
从’a2’列表右侧开始删除2个’b’
lrem a2 -2 b
set
⽆序集合
元素为string类型
元素具有唯⼀性,不重复
说明:对于集合没有修改操作
1.sadd 向键’a3’的集合中添加元素’zhangsan’、‘lisi’、‘wangwu’
sadd a3 zhangsan sili wangwu
2.smembers 获取键’a3’的集合中所有元素
smembers a3
3.srem 删除键’a3’的集合中元素’wangwu’
srem a3 wangwu
zset
sorted set,有序集合
元素为string类型
元素具有唯⼀性,不重复
每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序
说明:没有修改操作
1.zadd 向键’a4’的集合中添加元素’lisi’、‘wangwu’、‘zhaoliu’、‘zhangsan’,权重分别为4、5、6、3
zadd a4 4 lisi 5 wangwu 6 zhaoliu 3 zhangsan
2.zrange 获取:返回指定范围内的元素
start、stop为元素的下标索引
索引从左侧开始,第⼀个元素为0
索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
获取键’a4’的集合中所有元素
zrange as 0 -1 #和list一样都是用range,set是用smembers
3.zrangebyscore 获取键’a4’的集合中权限值在5和6之间的成员
zrangebyscore a4 5 6 #按键值来获取
4.zscore 获取键’a4’的集合中元素’zhangsan’的权重
zscore a4 zhangsan
5.zrem 删除集合’a4’中元素’zhangsan’
zrem a4 zhangsan
6.zrembyscore 删除集合’a4’中权限在5、6之间的元素
zrembyscore a4 5 6
搭建主从
概念:⼀个master可以拥有多个slave,⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构
master用来写数据,slave用来读数据,经统计:网站的读写比率是10:1
通过主从配置可以实现读写分离
master配置:
修改etc/redis/redis.conf文件
sudo vi redis.conf
bind 192.168.26.128
重启redis服务
sudo service redis stop
redis-server redis.conf
slave配置
复制etc/redis/redis.conf文件
sudo cp redis.conf ./slave.conf
修改redis/slave.conf文件
sudo vi slave.conf
编辑内容
bind 192.168.26.128
slaveof 192.168.26.128 6379
port 6378
redis服务
sudo redis-server slave.conf
查看主从关系:
redis-cli -h 192.168.26.128 info Replication
集群
为什么要有集群?
之前已经讲了主从的概念,一主可以多从,如果同时的访问量过大(1000w),主服务肯定就会挂掉,数据服务就挂掉了或者发生自然灾难
像很多 大公司都会有很多的服务器(华东地区、华南地区、华中地区、华北地区、西北地区、西南地区、东北地区、台港澳地区机房),这些就是集群服务器族。
集群的概念:
集群是一组相互独立的、通过高速网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。集群配置是用于提高可用性和可缩放性,当请求到来首先由负载均衡服务器处理,把请求转发到另外的一台服务器上
如果说主从提高了读写的效率,你们集群就是在主从的基础上进一步提高系统的稳定性和可扩展性。
简单集群的搭建:
启动一台计算机,如当前ip为:172.16.179.130
1.创建conf目录,在conf⽬录下创建⽂件7000.conf,并写入以下内容:
port 7000
bind 172.16.179.130
daemonize yes
pidfile 7000.pid
cluster-enabled yes
cluster-config-file 7000_node.conf
cluster-node-timeout 15000
appendonly yes
2.在7001.conf目录下写入一下内容:
port 7001
bind 172.16.179.130
daemonize yes
pidfile 7001.pid
cluster-enabled yes
cluster-config-file 7001_node.conf
cluster-node-timeout 15000
appendonly yes
3.在7002.conf目录下输入以下内容:
port 7002
bind 172.16.179.130
daemonize yes
pidfile 7002.pid
cluster-enabled yes
cluster-config-file 7002_node.conf
cluster-node-timeout 15000
appendonly yes
另外在启动一台计算机,如当前ip为:172.16.179.131
1.在conf⽬录下创建⽂件7003.conf,编辑内容如下
port 7003
bind 172.16.179.131
daemonize yes
pidfile 7003.pid
cluster-enabled yes
cluster-config-file 7003_node.conf
cluster-node-timeout 15000
appendonly yes
2.在conf⽬录下创建⽂件7004.conf,编辑内容如下
port 7004
bind 172.16.179.131
daemonize yes
pidfile 7004.pid
cluster-enabled yes
cluster-config-file 7004_node.conf
cluster-node-timeout 15000
appendonly yes
3.在conf⽬录下创建⽂件7005.conf,编辑内容如下
port 7005
bind 172.16.179.131
daemonize yes
pidfile 7005.pid
cluster-enabled yes
cluster-config-file 7005_node.conf
cluster-node-timeout 15000
appendonly yes
接下来的操作在172.16.179.130机器上进⾏
1.将命令复制,这样可以在任何⽬录下调⽤此命令
sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb /usr/local/bin/
2.安装ruby环境
sudo apt-get install ruby
3.运行如下命令就可以创建集群了:
redis-trib.rb create --replicas 1 172.16.179.130:7000 172.16.179.130:7001 172.16.179.130:7002 172.16.179.131:7003 172.16.179.131:7004 172.16.179.131:7005
提示如下主从信息,输⼊yes后回⻋
根据上图可以看出,当前搭建的主服务器为7000、7001、7003,对应的从服务器是7004、7005、7002
在172.16.179.128机器上连接7002,加参数-c表示连接到集群
redis-cli -h 172.16.179.131 -c -p 7002
写入数据:set name Python
⾃动跳到了7003服务器,并写⼊数据成功
集群的深入了解
redis cluster在设计的时候,就考虑到了去中⼼化,去中间件,也就是说,集群中 的每个节点都是平等的关系,都是对等的,每个节点都保存各⾃的数据和整个集 群的状态。每个节点都和其他所有节点连接,⽽且这些连接保持活跃,这样就保 证了我们只需要连接集群中的任意⼀个节点,就可以获取到其他节点的数据
Redis集群没有并使⽤传统的⼀致性哈希来分配数据,⽽是采⽤另外⼀种叫做哈希 槽 (hash slot)的⽅式来分配的。redis cluster 默认分配了 16384 个slot,当我们 set⼀个key 时,会⽤CRC16算法来取模得到所属的slot,然后将这个key 分到哈 希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所以我们在测试的 时候看到set 和 get 的时候,直接跳转到了7000端⼝的节点
Redis 集群会把数据存在⼀个 master 节点,然后在这个 master 和其对应的salve 之间进⾏数据同步。当读取数据时,也根据⼀致性哈希算法到对应的 master 节 点获取数据。只有当⼀个master 挂掉之后,才会启动⼀个对应的 salve 节点,充 当 master
需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存 活的主节点数⼩于总节点数的⼀半时,整个集群就⽆法提供服务了