redis基础学习

redis

    redis的意思是Remote Dictionary Server。是一个典型的key-value的数据库。redis经常会被拿来跟memcached作比较,但是他们之间最大区别就是memcached是内存中的缓存,并不能持久化,而redis可以做持久化的。而且redis性能高 – 能支持超过 100K+ 每秒的读写频率。并且支持的数据类型十分丰富。列表,字典,hash,集合,位图。
        redis的整个运行在内存中,但是会按照约定的方式将内容存进磁盘中。
        redis是单进程单线程的。就像是和nginx一样。
        redis有完善的高可用,主从(借助sentinel)而且3.0后,支持cluster。可实现分布式解决方案。
 

redis十分强大,1百万的小键值,大约会使用100M的内存。在常见的服务器上,大体上可承受50w的并发每秒。
数据库现主要分为3类:
 1.RDBMS关系型数据库:MySQL,Oracle,MariaDB,SQL Server。
 2.NOSQL非关系型数据库:LevelDB,Memcached,MongoDB(文档数据),Redis(其实memcached并不能完全称为NoSQL,因为memcached不存到磁盘)
 3.NewSQL分布式数据库:FoundationDB

在NOSQL中,kv的NoSQL:Redis,Tair
                       文档的NoSQL:MongoDB

与memcached的不同

     memcached是多线程的,redis是单线程的。
     memcached存储不持久,redis是支持持久存储。
     memcached善用多核CPU,redis不善用
     memcached可能有更少的内存分片。
    但是二者的性能不相上下。

持久化

      刚刚提到了redis的持久化,redis的持久化有两种方式,分别是snapshotting(快照)、AOF(Append Only File)的方式。
      Snapshotting:
      数据是异步传输从内存到磁盘。
      AOF:
      将每一次的写操作写到现有的文件后面。

Redis的组件

     redis-server  redis的服务器端
     redis-cli         redis的客户端
     redis-benchmark   redis的压测工具
     redis-check-dump & redis-check-aof  检测redis的持久化功能的。

安装Redis

   redis的官方站点是redis.io(io好像是英属印度洋领地)。目前的最新版本是3.2.8,进去直接下载就好了。

点击Download,下载tar包。   
或者执行命令
[root@localhost Downloads]# curl -O  http://download.redis.io/releases/redis-3.2.8.tar.gz

因为现在出现的redis版本是为了支持centos的systemctl启动脚本的,也就是说,操作系统必须是centos7及以上的版本,

解压,并直接make再make install。redis依赖于一个jemolloc,是一个内存分配器。
tar -xf redis-3.2.8.tar.gz -C /usr/local/
cd /usr/local/redis-3.2.8/
make
make install
/usr/local/redis-3.2.8/utils/install_server.sh 

redis的配置文件

[root@localhost redis]# pwd
/etc/redis
[root@localhost redis]# ls
6379.conf

redis的配置文件内容

bind 127.0.0.1 ::1 192.168.217.17  #绑定的IP

unixsocket /tmp/redis.sock #unixsock文件的位置
unixsocketperm 700 #unixsock的权限。如果通过unixsock去启动就不需要网络端口的那些tcp过程了。

 save <seconds> <changes>    快照持久化的方式(snapshoting)
save 900 1 #如果900s内,有1个键发生了变化,会赶紧做一次快照。(效率非常低)
save ""  #取消snapshoting格式的持久化。

 slaveof <masterip> <masterport>    主从复制
slave-read-only yes #slave的只读

appendonly no #启用aof持久化功能
appendfilename "appendonly.aof"


redis的客户端命令

redis-cli
[root@localhost init.d]# redis-cli
127.0.0.1:6379> 
 帮助信息
127.0.0.1:6379> help
redis-cli 3.2.5
To get help about Redis commands type:
      "help @<group>" to get a list of commands in <group>
      "help <command>" for help on <command>
      "help <tab>" to get a list of possible help topics
      "quit" to exit

To set redis-cli perferences:
      ":set hints" enable online hints
      ":set nohints" disable online hints
Set your preferences in ~/.redisclirc

 使用select 1,去启用第一个数据库,而最多是16个。(或者说是名称空间)
使用 help去获得set的帮助。
127.0.0.1:6379[1]> help set

  SET key value [EX seconds] [PX milliseconds] [NX|XX]
  summary: Set the string value of a key
  since: 1.0.0
  group: string

set去设置一个键值对。get去获取键值对。
127.0.0.1:6379> set name redhat
OK
127.0.0.1:6379> get name
"redhat"
127.0.0.1:6379> set name centos
OK
127.0.0.1:6379> get name
"centos"


实现数字的自增和自减。
127.0.0.1:6379> set count 0
OK
127.0.0.1:6379> incr count
(integer) 1
127.0.0.1:6379> incr count
(integer) 2
127.0.0.1:6379> incr count
(integer) 3
127.0.0.1:6379> incr count
(integer) 4
127.0.0.1:6379> incr count
(integer) 5
127.0.0.1:6379> decr count
(integer) 4
127.0.0.1:6379> decr count
(integer) 3


其中set命令中,最后面跟着的nx和xx。
127.0.0.1:6379> set key value [EX seconds] [PX milliseconds] [NX|XX]

nx是键不存在,才对键进行设置操作
xx是键存在,才对键进行操作设置
ex 加个秒数,是多长时间后这个键过期

不仅是string字符串,
还有list,set,sorted set(有序集合),hash。

list的操作。
l开头代表从左侧发起操作,r开头代表从右侧发起操作。如lpush,rpush
lpop 弹出,lindex 获得key的值
127.0.0.1:6379> lpush list 1
(integer) 1
127.0.0.1:6379> lindex list 0
"1"

set的操作
sadd 添加一个key
scard 获得key的内容

redis 的认证方法

在redis 的配置文件中的SECURITY段下加上requirepass 密码。就需要登录认证了。
在redis 的客户端去认证。
[root@localhost redis]# redis-cli 
127.0.0.1:6379> get 1
(error) NOAUTH Authentication required.
127.0.0.1:6379> AUTH redis
OK
127.0.0.1:6379> 

清空数据库

flushdb  清空库
flushall  清空所有库

redis的事务

redis是通过将一个client的所有请求连续的执行,而中间不插入其他的client的命令,来保证事务性的。
仅仅是实现了将多个请求打包成一个,串行执行。
通过multi,exec,watch等命令实现事务性。
演示一下过程。
[root@localhost redis]# redis-cli 
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set host1 centos
QUEUED
127.0.0.1:6379> get host1
QUEUED
127.0.0.1:6379> set host2 redhat
QUEUED
127.0.0.1:6379> get host2
QUEUED
127.0.0.1:6379> exec
1) OK
2) "centos"
3) OK
4) "redhat"


其中multi开启事务,开启事务后,其中的操作都不能立马完成,而是放到队列里,exec就是提交事务,所有的命令会被立马执行。
watch:乐观锁,在exec命令执行之前,用于监视指定数量键,如果监视中的某任意键被修改,则服务器拒绝执行事务。
在第一终端打开一个redis客户端1。
此时的host1是openSUSE

127.0.0.1:6379> get host1
"opensuse"

监控host1,并开启事务

127.0.0.1:6379> watch host1
OK
127.0.0.1:6379> multi
OK

这时第二个终端打开了,修改了host1

127.0.0.1:6379> set host1 redhat
OK
127.0.0.1:6379> get host1
"redhat"

第一个终端提交事务就是失败的。

127.0.0.1:6379> watch host1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> 

这就是事务的监控特性。但是redis不支持回滚操作。

redis 的主从复制

      虽然redis的读取速度是非常快的。但是redis和MySQL一样是有主从复制的,redis的为了解决读压力,也有主从结构,其中有一主多从,和级联结构。
      复制分为全量同步增量同步
      全量同步
      1).从服务器连接主服务器,发送SYNC命令
       2).主服务器接收到SYNC后,开始执行bgsave命令生成rdb文件并使用缓冲区记录此后执行的所有写命令。
       3).主服务器bgsave完成,向所有的从服务器发送快照文件,并在发送期间继续记录被执行的写命令。
       4).从服务器收到快照文件后丢弃所有的旧数据,载入收到的快照。
       5).主服务器快照发送完毕后开始向从服务器发送接收缓冲区的写命令。
       6).从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器的缓冲区的写命令。



      增量同步
      1).主服务器每执行一条写命令就会向从服务器发送相同的写命令。从服务器接收命令并且执行。

配置主从复制
    node1主服务器  192.168.217.17
    node2从服务器  192.168.217.16

从服务器的操作。
[root@node2 ~]# vim /etc/redis/6379.conf 

slaveof 192.168.217.17 6379

观察主服务器的状态。
[root@node1 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.217.16,port=6379,state=online,offset=71,lag=1
master_repl_offset:71
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:70
127.0.0.1:6379> 
观察从服务器的状态。
[root@node2 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.217.17
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:99
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379> 


健康检查,slave按照repl-ping-slave-period的间隔(默认是10秒),向master发送ping。
在slave上可以看到,slave在发送PING。
127.0.0.1:6379> MONITOR
OK
1491651464.592468 [0 192.168.217.17:6379] "PING"
1491651474.721863 [0 192.168.217.17:6379] "PING"
1491651485.674035 [0 192.168.217.17:6379] "PING"



redis的HA管理工具。

redis-sentinel能监视同期 的状态,发现master down的时候,会进行failover,划分slave升级为master时, 启动后会自 动更新sentinel设定的文件。发生failover时。会自动更改sentinel和redis的设定文件。sentinel去监视整个主从复制集群架构,若发现主节点挂了,sentinel之间会商量确定。并且去挑选新的主节点。实现故障转移。


(1)服务器自身初始化,运行redis-server的专用于sentinel

配置的环境。

master: 192.168.217.17  
slave1: 192.168.217.16
slave2: 192.168.217.15

进入解压后的源码包中,复制一个sentinel的模板出来。

[root@node1 redis-3.2.5]# cp sentinel.conf /etc/redis/
[root@node1 redis-3.2.5]# pwd
/usr/local/redis-3.2.5


master上的配置。编辑/etc/redis/sentinel.conf

daemmonize yes
sentinel monitor mymaster 192.168.217.17 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

第二行的其中最后一个2 代表的是法定票数,票数达到2,就认为挂掉这个事件成立。
第三行5s连不上就认为其离线。
第四行刚设为新主时,允许几个人连接
第五行故障转移的超时时长


概念:
主观下线:一个sentinel实例判断出某节点下线
客观下线:多个sentinel节点协商后判断出节点下线

启动sentinel
[root@node1 redis]# redis-sentinel /etc/redis/sentinel.conf --sentinel

连接并观察
[root@node1 redis]# redis-cli -p 26379
127.0.0.1:26379> INFO sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.217.17:6379,slaves=2,sentinels=1
127.0.0.1:26379> 


确认master的信息。sentinel masters
127.0.0.1:26379> sentinel masters
1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "192.168.217.17"
    5) "port"
    6) "6379"
    7) "runid"
    ...


确认两个slave的状态  sentinel slaves mymasters
127.0.0.1:26379> sentinel slaves mymaster
1)  1) "name"
    2) "192.168.217.16:6379"
    3) "ip"
    4) "192.168.217.16"
    ...
2)  1) "name"
    2) "192.168.217.15:6379"
    3) "ip"
    4) "192.168.217.15"
    ...


sentinel哨兵放在主节点上就好,也可以专门是几台主机去监控整个集群。

[root@node2 redis-3.2.5]# redis-server /etc/redis/sentinel.conf --sentinel

查看进程
[root@node3 ~]# ps aux |grep redis
root       1324  0.1  0.4 133524  2352 ?        Ssl  01:31   0:02 /usr/local/bin/redis-server *:6379      
root       1354  0.3  0.4 133528  2236 ?        Ssl  01:57   0:00 redis-server *:26379 [sentinel]                 

停止master。
127.0.0.1:26379> SHUTDOWN
not connected> 

主从切换

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于学习Redis基础知识,可以按照以下思路进行学习: 1. 了解Redis的概念和特点:首先需要了解Redis是什么,它的主要特点是什么,它为什么被广泛应用于缓存、消息队列、会话管理等场景。 2. 安装和配置Redis:根据你的操作系统,安装Redis并进行相关配置。可以参考Redis官方文档或其他教程来完成这一步。 3. 学习Redis的数据结构:Redis支持多种数据结构,如字符串、哈希、列表、集合和有序集合等。了解每种数据结构的特点、用途和操作命令,并通过实际操作来加深理解。 4. 掌握Redis的常用命令:学习Redis的常用命令,如get、set、hget、hset、lpush、lrange、sadd、smembers等,了解每个命令的具体用法和参数含义。 5. 理解Redis的持久化机制:了解Redis的RDB和AOF两种持久化方式,以及它们的优缺点。学习如何进行备份和恢复数据。 6. 学习Redis的事务和Lua脚本:了解Redis事务的基本概念和使用方法,以及如何使用Lua脚本来进行复杂的操作。 7. 深入了解Redis的性能优化和高可用方案:学习如何优化Redis的性能,包括配置调优、使用合适的数据结构、合理地使用缓存等。同时了解Redis的高可用方案,如主从复制、哨兵模式和集群模式。 8. 学习Redis与其他技术的结合:了解Redis如何与其他技术进行结合,如与Python、Java等编程语言的配合使用,以及与Spring、Django等框架的整合。 以上是学习Redis基础知识的一个思路,你可以根据自己的实际情况和需求进行学习和拓展。推荐参考一些经典的Redis教程和实战案例,通过实际操作和项目实践来提升自己的技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值