1.1redis本身支持事务处理,但是这种支持的事务处理本身是存在有设计缺陷的,而且与传统数据库的事务控制不同,首先来看一下redis中事务支持命令:
.打开事务:multi
.取消事务:discard
.提交事务:exec
1.2范例:观察redis中的事务:
先初始化一个数据
#设置一个数据
set age 30
现在对这个数据进行更新
#打开事务支持
multi
#进行数据操作
set age 300
set age 3000
#这里我们会发现一个很熟悉的单词提示,队列;因为我们一旦开启了事务支持,所有的更新操作都要追加到这个更新队列中
#y由于我们发现 300,3000对人的年龄不适合,所以我这里关闭事务,所以数据并没有提交,所以数据将会恢复到更新之前的状态
discard
上面的例子给我们一种错觉,好像确实符合事务控制的流程。
如果更新处理,执行了exec提交后,事务才会真正的执行。
看上去上面的事务控制似乎理所应当
但是这种事务本身是有bug的,因为redis的设计之初就是不要事务的。这里的事务就是一个玩笑。为什么说redis事务是一个笑话呢,下面一个例子来验证
set id huting #设置一个数据
multi #打开事务支持
incr id #【queued】进行数据操作
set age 500 #【queued】进行数据操作
exec #提交事务
#这个时候恭喜你 ,报错了。哈哈哈哈哈。。
原因分析:因为id的数据不是一个数字,所以不能进行自增更新,所以报错了,但是这个不是重点,重点的是,set age 500这句命令还是被执行了,
那么问题来了,部分提交成功,部分报错,这叫事务吗?现在我想你应该明白redis的事务控制是一个玩笑了。
所以nosql在应用上都是考虑不处理事务的情况居多。
悲观锁:SELECT * FROM table_test WHERE min = 1 FOR UPDATE
当A在执行这条操作的时候,B只能等待。
乐观锁:当A执行更新的同时 把Min的值改成了2,那么B再执行语句的时候会更新失败,但是不会影响其他的访问
1.在Redis里面 ,有直接支持乐观锁的。要观察乐观锁的处理,则可以打开两个不同的session来进行处理
打开两个控制窗口,进行操作我这里定义第一个为session1 第二个为session 2
我们按照下面的顺序开始操作开始操作
在session1中,我们进行如下的操作
#设置一个数据:
set age 30
#进行这个数据的监听
watch age
#启用事务
multi
#这个时候我们并没有对age做任何修改
在session 2对数据进行修改操作
set age 500
get age
回到session1
set age 60
#提交事务
exec
这个时候我们会发现session中的显示内容如下:
而且我们发现session1中的数据并没有更新成功:
原因分析:由于session2已经更新了原始数据,所以原始数据的标记列发生了变化,所以本次session1的更新就失败了,这就是所谓的乐观锁。
因为我们现在的Redis都没有进行认证的处理操作,那么所有的程序都可以进行连接,为了安全我们必须设置密码
1.在redis设计的时候并没有像其他的数据库那样准备了复杂的权限,唯一在redis里只需要设置验证密码就行
#第一步 修改redis.conf文件
vim /usr/local/src/redis/conf/redis.conf
#进入文件找到
#requirepass footbared
#在下面追加
requirepass huting666
#保存退出这样子密码就设置好了
#但是需要重新启动一下服务
#关闭服务
killall redis-server
#重新启动服务
/usr/local/src/redis/bin/redis-server /usr/local/src/redis/conf/redis.conf
2.进行redis登陆:
登陆redis服务器
注意注意了,登陆我们有两种方法
1.进入追加
/usr/local/src/redis/bin/redis-cli -h 127.0.0.1 -p 6379
#进入后追加命令
auth huting666
2.一步到位
/usr/local/src/redis/bin/redis-cli -h 127.0.0.1 -p 6379 -a huting666
!!!redis一定要设置密码,而且在集群开发的时候一定要将密码进行统一
我们这里采用“redis-stat”工具实现监控操作
1.为了体现redis的特点,下面建立三个redis运行进程,模拟的方式很简单,配置不同的redis端口就行,需要准备不同的redis.conf文件
首先干掉之前的redis目录
cd /usr/data/
rm -r redis
我们这里创建三个redis目录
mkdir -p /usr/data/redis/{redis-6379,redis-6380,redis-6381}/{run,logs,dbcache}
#将之前的redis的配置文件拷贝6379的一份
cp /usr/local/src/redis/conf/redis.conf /usr/local/src/redis/conf/redis-6379.conf
编辑每一个配置文件修改各自的内容
#以redis-6379为例子
vim /usr/local/redis/conf/redis-6379.conf
修改内容:
注释调:#bind 127.0.0.1 #取消外网访问
设置端口
pidfile /usr/data/redis/redis-6379/run/redis-6379.pid
logfile "路径";
dir 路径
完成 #这里的具体配置可以参考我之前redis安装教程来,由于已经写过一次,这里不必罗嗦了
将上面改好的文件复制两份:
cp /usr/local/src/redis/conf/redis-6379.conf /usr/local/src/redis/conf/redis-6380.conf
cp /usr/local/src/redis/conf/redis-6379.conf /usr/local/src/redis/conf/redis-6381.conf
使用vim命令分别先后打开上面复制的两份文件
vim /usr/local/src/redis/conf/redis-6380.conf
#输入面的命令进行全局修改
1,$s/6379/6380/
vim /usr/local/src/redis/conf/redis-6381.conf
#输入面的命令进行全局修改
1,$s/6379/6381/
重启redis服务
#重新启动redis的服务
/usr/local/src/redis/bin/redis-server /usr/local/src/redis/conf/redis-6379.conf
/usr/local/src/redis/bin/redis-server /usr/local/src/redis/conf/redis-6380.conf
/usr/local/src/redis/bin/redis-server /usr/local/src/redis/conf/redis-6381.conf
验证redis是否ok
ps -ef | grep redis
netstat -nptl
当你输入上面的命令出现下图的结果,那么恭喜你,到这里redis的模拟集群搭建好了
2.本机redis进程有了
下一步通过GITHUB下载redis-stat开发包
首先你要想使用redis-stat检测包必须下载ruby相关的环境:
ruby安装环境
注意这里一定要安装新版本的2.0.0以上的版本,不然后面你就等着报错吧!
然后git上的redis-stat工具下载到/usr/local/目录中
cd /usr/local
git clone https://github.com/junegunn/redis-stat.git
注意假如你的机器没有安装git,这里会提示你的命令无效,这个时候需要你进一步安装git
sudo yum install git
对不起,到这一步还不能使用,下载的redis-state里实际上只有一个执行命令,如果要使用这个命令,则
cd /usr/local/redis-stat/bin
#执行如下执行进行安装
gem install redis-stat
最后一步:启动redis-stat工具进行监听
#首先这里查看一下自己的ip
ifconfg
/usr/local/redis-stat/bin/redis-stat 162.38.134.37:6379 162.38.134.37:6380 162.38.134.37:6381 -a huting666
当你输入最后这条指令是,就会出现下图所以的性能检查表,恭喜你!
但是到这里我们还没有完,我们总部能每次查看redis性能都去后台查看。(另外值得注意的是这里的ruby最好使用2.3.0版本,不然太新和太久都会报错,不要为我为什么,因为我经历过!哈哈)
/usr/local/redis-stat/bin/redis-stat 阿里云ip:6379 阿里云ip:6380 阿里云ip:6381 -a huting666 --server=80 --daemon --verbose
执行完之后到你的window浏览器中输入你的ip地址即可,因为这里使用的是80端口,所以不需要添加端口号。
到这里性能监控就全做完了。