Redis3.2学习记录
nosql
特征:访问量大,高并发,高可用,海量数据
redis3.2
作用:减轻关系型数据库查询的压力
安装:
windows下解压即可使用,启动服务如:redis-server redis-config文件
linux下:
软件压缩包在/home/soft/下
tar -zxvf 源码 -C /usr/local/ 解压到/usr/local/下
进入解压目录,使用gcc编译(yum -y install gcc 安装)。生成可执行程序。
make编译,make install(可以不用,主要作用是将redis添加到环境变量中)
进入src中,启动服务:./redis-server,这种方式是前台启动,ctrl+c退出
后台启动 ./redis-server & (也可以在redis.conf中设置daemonize值为yes)
使用ps查看进程:ps -ef | grep redis
启动客户端:./redis-cli
关闭redis:
1.切换到redis/src/目录下,执行./redis-cli shutdown(比较安全,推荐使用这种方式,主要是先
完成数据的操作,在进行关闭)
2.kill pid 或者kill -9 pid(不推荐)
3.退出redis-cli 可输入exit
客户端:
1.命令行客户端,本机直接连接:./redis-cli
指定IP和端口连接:./redis-cli -h 127.0.0.1 -p 6379
2.图形客户端。redis desktop manager(这个工具需要本机有c编译库),远程访问
注意网络访问的安全策略,首先关闭linux的防火墙
centos6.5关闭防火墙命令
1.永久性生效,重启后不会复原
开启: chkconfig iptables on
关闭: chkconfig iptables off
2.即时生效,重启后复原
开启: service iptables start
关闭: service iptables stop
第二,修改redis.conf配置文件:(主要是redis有安全保护措施,默认只有本机访问)
bind ip 绑定ip此行注释掉
protected-mode yes 保护模式改为no
修改配置文件先做备份:cp redis.conf bak_redis.conf
使用vim 修改,
vim redis.conf
在命令模式下使用 /bind ;搜索bind关键字。
注意:修改后,我们在启动时要指定我们修改的配置文件;
./redis-server ../redis.conf &
查看防火墙:systemctl status firewalld (Active inactive关闭)
有一个java写的客户端工具:redisclient-win32x86_64.2.0.jar(直接使用,不用依赖啥C++类库的
)
编程客户端:Jedis
redis的数据持久化,内部执行
操作基本命令:
1.ping 返回PONG,表示当前服务可用
2.dbsize 查看当前数据库中key的数目(默认访问第0个库)
3.select db 切换数据库,如:select 5 表示使用第5 个库
4.flushdb 删除当前库的所有数据
5.exit或quit 退出客户端
操作key命令:
1.keys pattern 查找所有符合模式pattern的key,pattern使用通配符(在生产环境中,
少用*,采用 通配符查找,单线程查找,通配符(*所有、?单个字
符、))
2.exists key [key...] 判断key是否存在 返回整数数量。
3.expire key seconds 设置key的超时时间,如果key不存在,则设置无效,返回值0
4.ttl key 查看key剩余的生存时间(秒为单位),返回值-1:永久存在;-2不存在
;>0的值, 代表剩余生存时间
5.type key 查看key所存储值得数据类型
6.del key [key...] 删除指定的key,不存在的key忽略
操作value命令:
五种数据类型:
a.string 包括二进制数据,序列化后的数据,最大512M
b.hash 特别适合用于存储对象(分布式环境中解决session会话不一致,采用redis服务器
进行共享,使用hash存储当前登录的用户信息)
c.list 简单的字符串列表
d.set 无序集合,唯一,不能重复
e.zset 有序集合,经过排序的集合类型
数据类型操作命令:
A.string基本命令:
set,get,
incr(理解成i++,incr key[如果key不存在,则先创建+1] 值加1并返回,原子操作,可用
于全局的计数器)
decr 减一 (在线用户数,登陆+1,退出-1)
append key value 追加value,返回追加后的总字符数,如果追加的key不存在,则相对
set
B.string常用命令:
strlen key 长度
getrange key start end (相当substring(),)
setrange key offset value 用value覆盖(相等replace()。)
mset 创建多个key,value
mget 获取多个key值
A.hash基本命令:
hset key field value
hget key field
hmset key [field.. value..]
hmget key field[field...]
hgetall key 获取哈希表key中所有的域和值
hdel key field[field] 删除key中的field
B.hash常用命令:
hkeys key 获取key中的所有field
hvals key 获取key中的所有value
hexists key field 查看给定field是否存在
A.list基本命令:
头部操作:以l开始,尾部操作:以r开始
lpush key value[value...] 存储顺序和操作顺序相反
rpush key value[value...] 存储顺序和操作顺序一致
lrange key start stop 获取列表key中指定区间内的元素,包含start stop
lindex key index 获取指定下标index的成员
llen key 获取列表key的长度
B.list常用命令:
lrem key count value 根据参数count的值,删除列表中雨参数value相等的元素,count
>0,从列表的左侧向右侧删除,count <0,则从右向左,count =0,则删除与value相等的所有值,返回
删除元素的个数
lset key index value 将列表key下标为index的元素的值设置为value
linsert key BEFORE|ALFTER pivot value 将值value插入到列表key 当中位于值povot之
前或之后的位置
A.set基本命令:
sadd key member[member...] 添加成员,重复的成员无法添加的
smembers key 获取集合key中的所有成员元素,key不存在,则返回空集合
sismember key member 判断当前成员member在当前集合key中是否存在
scard key 获取集合里面的成员个数
srem key member[member...] 删除集合key中的一个或多个成员
B.set常用命令:
srandmember key [count] 随机返回集合中一(count)个元素,不删除元素,count默认为1
,count正数,返回的集合元素各不相同,count负数:则允许重复
spop key [count] 随机从集合中删除一(count)个元素,并返回删除的元素,count默认为1
A.zset基本命令:
zadd key score member[score member...] 将一个或多个member元素及其score值加入到
有序集合key中,如果member存在集合中,则更新值;socre可以是整数或浮点数
zrange key start stop[WITHSCORES] 查询有序集合,指定区间的内的元素,默认不带分
数socres
zrem key member[member...] 删除指定成员的member
zcard key 统计成员key的个数
B.zset常用命令:
zrangebyscore key min max [withscores] [LIMT offset count] 获取有序集key中,所
有score值介于min和max之间的成员,limit用来限制返回结果的数量和区间,withscores显示score
和value
高级部分:
A.redis事务(与写代码有关系,其他三项服务器设置)
transaction,一组命令的集合,保证至少有两条及以上命令被正常执行。
1.multi 事务的开始标志,当前还未执行命令
2.exec 执行所所有事务块内的命令
3.discard 取消事务
事务的执行过程:首先开启事务multi,其次向事务队列中加入命令,最后执行事务提交exec
redis事务是没有回滚的,只保证性能
4.watch key [key...] 监视当前key是否被其他事务改变
watch机制:主动放弃事务。这种方式避免了资源竞争,解决数据安全问题
对比sql事务中,算是乐观锁机制
5.unwatch key [key...] 取消监视
B.持久化
两种方式:
1.RDB(redis database)方式:在指定时间间隔内将内存中的数据快照写入到磁盘中(默认
是dump.rdb),保存数据是在单独进程中写文件,默认开启的。
实现:redis.conf中配置
save: 配置执行RDB生成快照文件的时间策略
dbfilename:设置RDB的文件名,默认文件为dump.rdb
dir:指定RDB文件的存储位置,默认是./当前目录
优点:由于存储的是数据快照文件,恢复数据很方便,也比较快
缺点:会丢失最后一次快照以后更改的数据。由于经常操作磁盘,RDB会分出一个子进程,
如果redis数据很大,子进程占用比较多的时间。
3.AOF(Append-only File)方式:如果你怕数据丢失,可以采用AOP方式,即redi每次接
收到一条改变数据的命令时,它将把该命令写到一个AOF文件中(只记录写操作,读操作不记录),
当redis重启时,它通过执行AOF文件中所有的命令来恢复数据。
实现:redis.conf中配置
appendonly:默认是no,改成yes即可开启aof持久化
appendfilename:指定AOF文件名,默认文件名为appendonly.aof
dir:指定RDB和AOF文件存放的命令,默认是./
appendfsync:配置aof文件写命令数据的策略;
no:不主动进行同步操作,而是完全交由操作系统来做(即每30s一次),
比较快但不是很安全
always:每次执行写入都会执行同步,慢一些但比较安全
everysec:每秒执行一次同步操作,比较平衡,介于速度和安全之间。默
认项
auto-aof-rewrite-min-size:允许重写的最小AOF文件大小,默认是64M.当文件大
于64M时,开始自动整理aof文件,去掉无用的操作命令。
C.主从复制
高可用的解决方案,集群(一种服务器的网络结构)
1.主从复制--读写分离原则
两种实现方式:1.修改配置文件,启动时,指定主从服务器。(实际开发中使用)
2.命令行中指定master-slave之间的关系。
修改配置文件,分别配置master-slave的conf文件
master:redis6380.conf
include /usr/local/redis-3.2.10/redis.conf
daemonize yes
port 6380
pidfile /var/run/redis_6380.pid
logfile 6380.log
dbfilename dump6380.rdb
slave:redis6382.conf
include /usr/local/redis-3.2.10/redis.conf
daemonize yes
port 6382
pidfile /var/run/redis_6382.pid
logfile 6382.log
dbfilename dump6382.rdb
slaveof 127.0.0.1 6380
slave:redis6384.conf
include /usr/local/redis-3.2.10/redis.conf
daemonize yes
port 6384
pidfile /var/run/redis_6384.pid
logfile 6384.log
dbfilename dump6384.rdb
slaveof 127.0.0.1 6380
info replication 查看启动的master-slave信息关系
问题:容灾处理
A.Master6380突然停止(模拟挂掉)
将slave 6382升级为master,salve 6384新挂载到新master上
命令:slaveof no one表示将当前从服务器升级为master;
slaveof host port改成成新的从服务器slave
B.把突然挂掉的服务修好了,重新添加到现在的主从关系中。
重新启动6380
执行salveof 127.0.0.1 6382
+++++++++++++++++++上面出了故障,需要人为参与,为使自动,产生哨兵模式++++++++++++
2.高可用Sentine哨兵
监控--主从服务器是否正常工作
提醒--通过sentinel会通知管理员或其他应用程序
自动故障转移--监控的主redis不能正常工作,sentinel会开始进行故障迁移操作
,重新分配主从redis
哨兵:奇数个,至少三个,采取投票方式决定。默认端口26379
哨兵监控主redis,采用心跳机制,ping根据响应结果判断redis运行状态.
哨兵是独立的程序,之间相互独立的
配置哨兵配置文件:
主要修改两个位置:
port 26380
sentinel monitor mymaster 127.0.0.1 6380 2
格式:sentinel monitor <name> <masterIP> <masterPort> <Quorum投票数>
启动哨兵模式后,自动化处理故障的主从关系。
D.安全设置
1.设置密码
2.绑定ip
修改默认端口
E.Jedis操作Redis
redis是单线程,存在线程不安全问题,往往与common-pool一起使用,创建连接池。获取
jedis对象进行操作。
F.redis中有关技术问题:
1.缓存穿透:
在高并发条件下,会导致无法从缓存中查询到数据,直接从数据库查询,请求量
过大,这样会导致数据库系统压力很大。这种情况下,就是缓存穿透。
解决方案:
采用多线程方式解决,使用锁或关键字synchronized,双重检测锁进行。
2.缓存雪崩:
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,
会给后端系统带来很大压力。导致系统崩溃。
1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对
某个key只允许一个线程查询数据和写缓存,其他线程等待。
2:做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存
失效时间设置为短期,A2设置为长期
3:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
Redis3.2学习记录的更多相关文章
- Quartz 学习记录1
原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...
- Java 静态内部类与非静态内部类 学习记录.
目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ...
- Apache Shiro 学习记录4
今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ...
- UWP学习记录12-应用到应用的通信
UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ...
- UWP学习记录11-设计和UI
UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ...
- UWP学习记录10-设计和UI之控件和模式7
UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ...
- UWP学习记录9-设计和UI之控件和模式6
UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ...
- UWP学习记录8-设计和UI之控件和模式5
UWP学习记录8-设计和UI之控件和模式5 1.日历.日期和时间控件 日期和时间控件提供了标准的本地化方法,可供用户在应用中查看并设置日期和时间值. 有四个日期和时间控件可供选择,选择的依据如下: 日 ...
- UWP学习记录7-设计和UI之控件和模式4
UWP学习记录7-设计和UI之控件和模式4 1.翻转视图 使用翻转视图浏览集合中的图像或其他项目(例如相册中的照片或产品详细信息页中的项目),一次显示一个项目. 对于触摸设备,轻扫某个项将在整个集合中 ...
随机推荐
- 添加tag
创建tag git tag -a V1 -m 'release 1' 创建了本地一个版本v1,同时添加注释 release 1 查看tag git tag 显示注释 git show V1 本地tag ...
- Liunx之MySQL安装与主从复制
MYSQL安装(mariadb) MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可. 开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL ...
- Spring Boot 中 Druid 的监控页面配置
Druid的性能相比HikariCp等其他数据库连接池有一定的差距,但是数据库的相关属性的监控,别的连接池可能还追不上,如图: 今天写一下 Spring Boot 中监控页面的配置,我是直接将seat ...
- RuntimeException异常处理汇总
Java中所有异常的父类是Throwable类,在Throwable类下有两大子类: 一个是Error类,指系统错误异常,例如:VirtualMachineError 虚拟机错误,ThreadDeat ...
- python获取当前py文件的文件名或者当前工具箱的名字
#########################import arcpy import osimport sys ########################################## ...
- web前端——Vue.js基础学习之class与样式绑定
打着巩固 css 知识的旗号开始了对 vue 样式绑定的研究,相比前一篇的 demo,本次内容多了各种样式在里面,变得稍微花哨了些,话不多说,直接上代码吧: <html> <head ...
- Vue中可用的判断对象是否为空的方法
vue有两个方法可用 1. JSON.stringify(evtValue)=='{}' 2. Object.keys(xxx).length==0 js判断对象是否为空对象的几种方法 1.将json ...
- cnpm与npm指定有什么区别?
CNPM跟NPM用法完全一致,只是在执行命令时将故宫改为CNPM. 因为故宫安装插件是从国外服务器下载,受网络影响大,可能出现异常,如果故宫的服务器在中国就好了,所以我们乐于分享的淘宝团队干了这事来自 ...
- SQL-W3School-高级:SQL 约束(Contraints)
ylbtech-SQL-W3School-高级:SQL 约束(Contraints) 1.返回顶部 1. SQL 约束 约束用于限制加入表的数据的类型. 可以在创建表时规定约束(通过 CREATE T ...
- smart_pointer example
#pragma oncetemplate<typename T>class smart_pointer{private: T* m_pRawPointer;public: smart_po ...