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.翻转视图 使用翻转视图浏览集合中的图像或其他项目(例如相册中的照片或产品详细信息页中的项目),一次显示一个项目. 对于触摸设备,轻扫某个项将在整个集合中 ...
随机推荐
- sz/rz
需要客户端的支持,CRT或者Xshell等 linux端默认是不支持的, 不用通过传输工具来传输文件 yum -y install lrzsz
- 数据分析九:互联网征信中的信用评分模型(用户APP使用行为分析)
用户APP使用行为数据分析: 一. 背景及数据介绍: 1. 移动互联网发展背景: 网民规模7.72亿,手机网民规模7.53亿: 2. APP使用热点: 商务交易类应用规模高速增长(网络购物,网上外卖, ...
- confluence乱码问题
1.上传附件需要统一字体,以测试通过:宋体字.雅黑.黑体 2.系统已做编码优化,支持windows字体.如下: 点击查看 3.之前文件有乱码,请重新上传 4.编辑一个 Office 附件文档的要求 当 ...
- php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
使用压缩包函数必须要安装zip扩展,否则会报错 $ apt install php-zip
- 《视觉SLAM十四讲》学习日志(一)——预备知识
SLAM简介 : SLAM是 Simultaneous Localization and Mapping 的缩写,中文译作 " 同时定位与地图构建 ".它是指搭载特定传感器的主题, ...
- bash基础之三配置文件
一.shell的两种登录方式: 1.交互式登录:(1)直接通过终端输入账号密码登录(2)使用“su - UserName” 或“su -l Username”切换的用户执行顺序:/etc/profil ...
- Egyptian Collegiate Programming Contest (ECPC 2015) C题 Connecting Graph
这题上次用的是线性求LCA过的,数据比较水,当时没有被T掉(不过线性的做法是在线的).现在重新的分析一下这个问题.在所有的操作都进行完毕以后,这个图形肯定会变成一棵树,而我们的要求是在这棵树上的一条链 ...
- Hadoop环境搭建|第四篇:hive环境搭建
一.环境搭建 注意:hive版本不能太高,否则会出现兼容性问题 1.1.上传hive安装包 创建文件夹用于存放hive文件命令:mkdir hive 1.2.解压hive安装包 命令:tar -zxv ...
- LDA线性分析推广到多分类
感谢皮果提的文章: http://blog.csdn.net/itplus/article/details/12038441 http://blog.csdn.net/itplus/article 皮 ...
- VScode优化记录
主题: One Dark Pro VS Code 官网页面 这是为 VS Code准备的 One Dark 主题,他是 Atom 标志性的主题.需要我说更多吗?我喜欢这个主题. Mon ...