一头扎进redis操作
1.redis简介
NoSQL(Not only SQL)属于非关系型数据库;redis就属于非关系型数据库
为什么需要NoSQL,主要应对以下问题:
高并发读写
海量数据的高效率存储与访问
高可扩展性和高可用性
NoSQL产品:MangoDB、Redis(主流)
NoSQL的特点:
易扩展
灵活的数据模型
大数据量、高性能、高可用性
高性能键值对数据库,支持的键值数据类型:
字符串类型
列表类型
有序集合类型
散列类型
集合类型
Redis的应用场景
缓存、任务队列、网站访问统计、数据过期处理、应用排行榜、分布式集群架构中的session分离
2.redis安装
安装gcc
yum –y install gcc-c++
Wget方式下载redis压缩包,并解压,以及编译
wget http://download.redis.io/releases/redis-4.0.12.tar.gz
解压:
tar –zxvf /root/redis-xxxxx
编译
进入redis的目录,使用make
安装redis
make PREFIX=/usr/local/redis install
Cd回到root,我们需要把一个配置文件 复制到redis下 后台启动用到
启动和关闭redis服务
进入/usr/local/redis目录,
然后使用bin/redis-server启动redis
通过ctrl+c退出当前程序
正式因为这个原因,必须让其后台运行
通过修改配置文件redis.conf
进入redis目录,加载配置文件运行
关闭redis服务
bin/redis-cli shutdown
Redis基本使用
bin/redis-cli
3.使用jedis连接redis
新建maven项目,在pom.xml中导入依赖
连接超时,因为redis的6379端口没有开放
注释掉这一行
修改后还会出错
Jedis连接池的使用
package cn.huangwei.test;
import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig;
public class JedisPoolTest { public static void main(String[] args) { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(100);//设置最大链接数 config.setMaxIdle(10);//设置最大空闲链接数 //创建连接池 JedisPool pool = new JedisPool(config, "192.168.220.128", 6379); Jedis jedis = null; try { jedis = pool.getResource(); jedis.auth("123456"); jedis.set("name", "huangwei"); String value = jedis.get("name"); System.out.println(value); }catch(Exception e) { e.printStackTrace(); }finally { if(jedis != null) { jedis.close(); }
if(pool != null) { pool.close(); } } } }
|
4. redis的数据类型
字符串
扩展: incrby 指定增量值
decrby 指定减量值
append 源字符串 追加字符串
假设没有定义 直接赋值
哈希
hset 哈希名 key value
hmset 多个字段一起设置
hmset 哈希名 key value key value
删除
hincrby 增加数字
hincrby 哈希名 key 增量
hexists判断字段是否存在 1表示存在 0表示不存在
hexists 哈希名 key
hlen 哈希名 :获取hash属性个数
hkeys 哈希名: 获取所有属性的名称
hvals 哈希名:获取所有属性的值
List
lpush 从左边开始添加
lrange 获取指定方位的集合元素
rpush 从右边开始添加
lpop 左侧弹出集合元素
rpop 右侧弹出集合元素
llen 查看集合元素的个数
lpushx 集合头部(前面)插入元素(一个)
lrem 从指定方向删除指定个数的指定元素
lrem 集合名 删除个数 删除的值
索引从0开始
lset 集合名 索引 设置值
Set:不允许有重复的数据元素
sadd key member:添加set元素
smembers key 查询指定key集合的元素
scard key:计算元素总数
srandmember key :随机取一个元素
sinterstore 把交集结果存到新集合中去
sinterstore 新集合 集合1 集合2
sunionstore 新集合 集合1 集合2:把并集结果存到新集合中
Sorted-set
zadd 添加元素 里面包括评分和值
zrange 查找元素 -1代表是最后一个
如果添加的时候,值已经有了,评分不一样,就会覆盖旧的评分
zrem key 值 :删除元素
zcard key :查找元素个数
zrange key 0 -1 withscores 罗列评分和值
zrevrange 降序排列,用法与上面一致
zremrangebyrank 根据排名来删除元素 删除3个
zremrangebyrank sort1 0 2
zremrangebyscore 根据具体评分范围来删除元素
zremrangebyscore sort1 10 16 删除评分10-16的
zrangebyscore sort1 18 23 withscores limit 0 2;显示18-13分数的第0个开始,每页显示两个
Keys通用操作
keys s*表示s开头的集合
key s?表示s开头后面只有1个字符 的集合
del 删除key,可以跟多个key
exists判断key是否存在 1表示存在,0表示不存在
get 获取元素
rename对key重命名
expire 设置n的有效时间 秒
expire n 100
ttl查看剩余时间
type 显示类型
5.redis持久化
RDB持久化方法:指定时间间隔写入硬盘
AOF持久化方法:以日志的方式,记录每一个操作,服务器启动后就构建数据库
配置可以金庸持久化功能,也可以同时使用两种方式
5.1 Redis的持久化之RDB方式
优势:只有一个文件,时间间隔的数据,可以归档为一个文件,方便压缩转移(就一个文件)
劣势:如果宕机,数据损失比较大,因为它是每一个时间段进行持久化操作的,也就是积攒的数据比较多。
每900秒内至少有1个key发生变化,就持久化
每300秒内至少有10个key发生变化,就持久化
每60秒内至少有10000个key发生变化,就持久化
保存的持久化文件名 默认是dump.rdb
文件存储路径是当前路径
RDB备份和回复数据
假如遇到断电或者宕机或者自然灾害,我们需要恢复数据,模拟测试
删除dump.rdb文件
然后重新链接,查看keys是否为空
添加数据,然后shutdown保存退出
加入这个时候重启redis,这个时候启动过程会进行rdb check验证,然后加载redis目录下rdb文件;加载数据
这里将redis下的rdb文件剪切到其他地方去,然后再启动下
此时数据已经没了,如果需要恢复,只需要将刚刚的rdb文件拷贝到当前目录即可
5.2 Redis的持久化之AOF方式
默认关闭aof方式 修改成yes就会开启
三种同步策略:
Always是只要发生修改,立即同步(推荐使用,安全性最高)
Everysec每秒同步一次
No不同步
6.redis集群概述
redis cluster是去中心化,去中间件的,也就是说,集群中的每个节点都是平等关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点链接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
Redis是如何合理分配这些节点和数据的呢?
Redis集群并没有使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽hash slot的方式来分配的。Redis集群默认分配16384个slot,当我们set一个key时,会用CRC16算法来取模得到所属的slot,然后将这个key分到哈希槽区间的节点上,具体算法就是CRC16(key) % 16384
必须要3个以后的主节点,否则创建集群时会失败。
所以如果我们假设现在又3个节点已经组成了集群,分别是:A、B、C三个节点,他们可以时一台机器上的三个端口,也可以是三台不同的服务器。那么,采用哈希槽方式来分配16384个slot的话,他们三个节点分别承担的slot区间是:
A:覆盖0-5460 B:覆盖5461-10922 C: 覆盖10923-16383
如果现在设置一个key,my_name, set my_name wind
这样按照redis cluster的哈希算法:CRC(‘my_name’) % 16384 = 2412,就会分配到A上了
同样,当连接ABC任何一个节点,想获取my_name这个key时,也会这样的算法,从指定节点拿取数据
6.1单机多节点集群操作
①Redis安装包里有个集群工具,要复制到/usr/local/bin里去
cp /home/redis/redis-4.0.12/src/redis-trib.rb /usr/local/bin
②修改配置,创建节点
弄六个节点,三主三从
端口分别是7001,7002,7003,7004,7005,7006
我们首先在root目录下新建一个redis_cluster目录,然后在该目录下创建6个目录,分别是7001-7006,用来存储redis的配置文件
这里使用redis集群,首先要修改redis的配置文件redis.conf
复制一份配置文件到7001目录下
修改以下几点:
Port 7001 //其他几个文件夹也分别配置
Daemonize yes //redis后台运行
Pidfile /var/run/redis_7001.pid //pidfile文件对应7001-7006
Cluster-enable yes //开启集群
Cluster-config-file nodes_7001.conf //保存节点配置,自动创建,自动更新对应7001-7006
Cluster-node-timeout 5000 //集群超时时间,节点超过这个时间没反应就断定时宕机
Appendonly yes //存储方式,aof,将写操作记录到保存日志中
7001的配置文件修改完之后,在复制到其他7002-7006,然后修改配置
③启动六个节点的redis
④查找redis进程
ps –ef|grep redis
⑤创建集群
使用之前需要安装ruby,以及redis和ruby连接
yum –y install ruby ruby-devel rubygems rpm-build
gem install redis
解决:
安装rvm
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
curl -sSL https://get.rvm.io | bash -s stable
find / -name rvm –print 查看是否安装成功
source /usr/local/rvm/scripts/rvm
查看rvm库中一直的ruby版本
安装一个ruby的版本
rvm install 2.4.5
创建集群
redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006
如果出现问题,说明没有装ruby和redis 的链接接口
gem install redis
出现这个问题:
先把刚刚启动redis的进程给关闭,然后删除一些数据文件rdb,aof,node-conf等文件,这样重新进入就可以了
删除之后重新启动六个节点redis
⑥集群数据测试
链接任意一个节点,添加一个key;
/usr/local/redis/bin/redis-cli –c –p 7002
-c表示集群,-p表示端口
⑦集群宕机的情况
假如一个主节点宕机了,从节点会升级为主节点,,如果主从都宕机了,这个节点就会挂掉了
假设干掉7002这个主节点
先查找redis的连接端口,然后找到7002对应的端口,kill -9 xxxx
查看集群的情况
redis-trib.rb check 127.0.0.1:7001
在考虑把7004干掉,看会出现什么情况
这个的主从已经结束了,只剩下两个主,两个从
本文地址:https://blog.csdn.net/huangwei18351/article/details/85990013
上一篇: 爬虫之MySQL数据库使用规范