redisredis的基础入门(linux)

Posted 白日梦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redisredis的基础入门(linux)相关的知识,希望对你有一定的参考价值。

1.memcache与redis对比

  memcahce只有一种string数据结构,而redis有5种数据数据存储,memcahce具有的方法redis基本全部都有,且redis代码更简洁,更加易读,更加具有维护性,性能方面基本差不多,redis支持持久化,memcache自身不支持持久化。

 

2.redis数据类型与api

string,list,set,hash,zset

redis  api: http://redisdoc.com/

备注:incr ,decr,incrby,decrby 是原子性操作 ,keys支持pattern模式 ,如keys * :表示匹配所以, key k?:?表示一个字符。

 

3.通用命令:

Tab:补全命令

redis-server redis.conf;//按指定配置文件启动服务器

redis-cli  -p  6379 ;//-h没写默认为localhost ,-p端口,启动客户端

redis-check-aof  aof文件名;// aof文件修复,这里需要使用diff命令比较一下与原文件的差异

redis-check-rdb  rdb文件名;//rdb文件修复,这里需要使用diff命令比较一下与原文件的差异

config set  配置文件参数 ;//修改配置参数

config get  配置文件参数 ;//获取配置参数

redis-benchmark  -h ip  -p port  -c number  -n number  //redis性能测试

redis-benchmark参数说明:http://www.runoob.com/redis/redis-benchmarks.html

 

4.登录客户端后的常用命令

clear:清屏 ; 

flushdb:清空当前库且将数据保存持久化;

flushall:清空所有库且将数据保存持久化 ;

shutdown:将数据持久化并关闭会话

exit:将数据持久化并退出;  

save :将数据持久化,同步阻塞,保证数据安全;

bgsave:异步进行快照,可以通过lastsave获取最后一次保存的快照的时间,保证效率

select  库 //切换库

dbsize //查看当前库的key的大小

 

5.设置密码//一般没有必要,因为他不是做安全的

获取密码:config get requirepass //默认没有密码

设置密码:config set  requirepass  12345678

登录 :auth  密码

redis的配置文件中的说明

 

6.分布式中的cap原理

C:Consistency(强一致性)

A:Availability(可用性)

P:Partition tolerance(分区容错性)

选用原则

由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须需要实现的。 AP 大多数网站架构的选择, CA 传统Oracle数据库

 

7.redis的持久化aof与rdb

1)rdb的持久化

redis中的配置中设置如下:

只要满足以下三个条件中的任意一个,BGSAVE命令就会被执行

服务器在900秒之内,对数据库进行了至少1次修改;
服务器在300秒之内,对数据库进行了至少10次修改;

服务器在60秒之内,对数据库进行了至少10000次修改.

 

2)aof持久化

appendonly no;//默认为关闭,开启设置为yes

appendfilename appendonly.aof;//默认的aof的文件文件名

appendfsync everysec ;//默认写入策略

参数如下

no:表示等操作系统进行数据缓存同步到磁盘(快) 

always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) 

everysec:表示每秒一次(折衷,默认值)

备注:no太慢,always太快系统易崩溃

 

3)rdb与aof的比较

rdb在恢复大数据集时的速度比 aof的恢复速度要快,rdb远比aof文件小,发生故障停机aof比rdb丢失的数据少

 

4)aof的重写原理:

当aof文件达到一定的值后(配置文件中默认为64M,auto-aof-rewrite-percentage 100,

auto-aof-rewrite-min-size 64mb),会fork出一条新进程来将文件重写(先写临时文件,然后删除原文件,最后再rename),遍历新进程的内存中数据,重写aof文件,优化文件大小(前面多条set或者incr等,最后就只剩一下,一个键和一条值,一个set语句),并没有读取旧的aof文件,将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。

备注:rdb与aof出现错误后的修复前面已写,一般而言两个都开启,倘若flush了,那么可以打开相应的aof文件,删除flush语句重新加载可以修复,但是在重写aof后不能恢复,aof文件优先于rbd文件加载。

 

8.Redis的事务

1)api

开启事物multi

取消事务:discard

提交事物exec  //提交之后无论失败还是成功都会取消监控

监控:watch

取消监控:unwatch  //取消所有的监控

 

2)回滚

开启事务后在exec之前报错,那么会全部回滚,假如在exec之后报错,那么没出错的语句继续执行,不会回滚

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1  v1
QUEUED
127.0.0.1:6379> getset k2
(error) ERR wrong number of arguments for \'getset\' command
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> incr k1
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) ERR value is not an integer or out of range
127.0.0.1:6379> get k1
"v1"

 

3)watch与unwatch

watch指令,类似乐观锁,事务提交时,如果Key的值已被别的客户端改变,整个事务队列都不会被执行,通过watch命令在事务执行之前监控了多个Keys,倘若在watch之后multi之前有任何Key的值发生了变化,exec命令执行的事务都将被放弃,同时返回Nullmulti-bulk应答以通知调用者事务执行失败.

客户端1 //成功案例
127.0.0.1:6379> set k1 1000
OK
127.0.0.1:6379> set k2  0
OK
127.0.0.1:6379> WATCH k1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> DECRby k1 500
QUEUED
127.0.0.1:6379> INCRby k2 500
QUEUED
127.0.0.1:6379> exec
1) (integer) 500
2) (integer) 500
客户端1//在multi之前,watch之后修改了数据,所以multi中的内容无效
127.0.0.1:6379> set  k1 1000
OK
127.0.0.1:6379> set  k2 0
OK
127.0.0.1:6379> WATCH  k1
OK
127.0.0.1:6379> set  k1 500
OK
127.0.0.1:6379> MULTI 
OK
127.0.0.1:6379> DECRBY k1 500
QUEUED
127.0.0.1:6379> INCRBY  k2 500
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get k1
"500"
客户端1//正常走
127.0.0.1:6379> set  k1 1000
OK
127.0.0.1:6379> set  k2 0
OK
127.0.0.1:6379> WATCH  k1
OK
127.0.0.1:6379> MULTI 
OK
127.0.0.1:6379> DECRBY k1 500
QUEUED
127.0.0.1:6379> INCRBY  k2 500
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get k1
"2000"
客户端2//设置值,导致上述失败
set k1  2000

备注:

单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。没有隔离级别的概念:队列中的命令没有提交之前都不会实际的被执行,因为事务提交前任何指令都不会被实际执行,不保证原子性:redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。

悲观锁:认为别人对自己是不安全的,将整个相应的空间都锁起来,例如表锁,写锁等

乐观锁:认为别人对自己是安全的,类似行锁,在修改行后面加一个版本号,例如当版本是1,两个人都同时哪一个数据,差不多时间提交,当有人提交后,变为2,然后后提交的版本与当前版本冲突,就需要解决冲突后提交,类似版本管理。

 

9.redis的发布订阅

略,基本不会使用,因为基本上都使用activemq

 

10.主从复制//优点:读写分离,容灾恢复

1)文件配置(一主二仆)

需要修改的配置(端口和文件地址)

port 

pidfile

logfile

dbfilename

appendfilename (开启aof之后需要更改)

2)1为主2,3为从

主//info replication

从 //SLAVEOF 127.0.0.1 6379,另一个从类似

备注:只能主写,从不能写,主掉了,两仆还是两仆,主回来后依旧是主

 

3)薪火相传

另一个挂在一个从上,但是被挂载的从,还是从

备注:主掉了,仆还是仆,主回来后依旧是主

 

4)反客为主//SLAVEOF no one

备注:反客为主后跟主没关系了

 

4)哨兵模式

配置文件

新建sentinel.conf文件,名字绝不能错,文件内的内容

sentinel monitor mymaster 127.0.0.1 6379 1   // mymaster主机名能谁便取, ip  ,prot,投票数

sentinel down-after-milliseconds mymaster 5000  //配置多长时间检测一次,默认30秒,这里配置5秒
sentinel failover-timeout mymaster 900000
sentinel parallel-syncs mymaster 2

 

启动 redis-sentinel   sentinel.conf文件路径

备注:主掉线之后,从机进行投票,在从机中自动的选出主机,主回来后变从机

 

以上是关于redisredis的基础入门(linux)的主要内容,如果未能解决你的问题,请参考以下文章

Redis基础入门

Redis学习汇总(已完结)

Redis 小白入门以及基础搭建

Linux学习从入门到打死也不放弃,完全笔记整理(持续更新)

Day8: Linux基础片:网络配置

Linux学习之路-基础入门 20191104