GVKun编程网logo

NOSQL之Redis学习札记(nosql redis)

14

本文将带您了解关于NOSQL之Redis学习札记的新内容,同时我们还将为您解释nosqlredis的相关知识,另外,我们还将为您提供关于NosqlRedis学习、NoSQL之Redis、NoSQL之R

本文将带您了解关于NOSQL之Redis学习札记的新内容,同时我们还将为您解释nosql redis的相关知识,另外,我们还将为您提供关于Nosql Redis学习、NoSQL之Redis、NoSQL之Redis - CentOS 6.5安装测试、NoSQL之Redis 高可用性集群方案,应急维护技巧的实用信息。

本文目录一览:

NOSQL之Redis学习札记(nosql redis)

NOSQL之Redis学习札记(nosql redis)

根据某学习视频所记录的笔记:

一、NOsql适用场景:

1.对数据高并发读写

2.对海量数据的高效率存储和访问

3.对数据的高扩展性和高可用性

二、Redis的介绍

Redis是一个开源的,先进的Key-Value存储。它通常被称为数据结构服务器,因为键可以包含字符串、哈希、链表、集合和有序集合。这些数据类型都支持push/pop、add/remove及取交集和并集及更丰富的操作,Redis支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中的,它可以周期性的把更新的数据写入磁盘或者把修改的操作写入追加的记录文件。

全球最大的Redis用户是新浪微博,在新浪有200多台物理机,400多个端口正在运行着Redis,有+4G的数据在Redis上位微博用户提供服务。在新浪微博Redis的部署场景很多,大概分为以下2中:

1.应用程序直接访问Redis数据库:写MysqL,通过触发器更新Redis的方式



不安全,Redis服务器宕机,或者内存中的数据被释放了,数据就永久丢失了

2.应用程序直接访问Redis,只有当Redis访问失败时才访问MysqL



三、Redis具体适用场合:

1.取最新N个数据的操作

2.排行榜应用,取TOP N操作

3.需要精确设定过期时间的应用

4.计数器应用

5.Uniq操作,获取某段时间所有数据排重值

6.实时系统,反垃圾系统

7.pub/sub(发布/订阅)构建实时消息系统

8.构建队列系统

9.缓存

四、Redis的安装部署(32-UbuntuLinux下)

1.下载安装包:

wget http://redis.googlecode.com/files/redis-2.6.14.tar.gz

手动下载地址:http://download.csdn.net/detail/chc340121/8164989

2.编译源程序:

tar -zxvfredis-2.6.14.tar.gz

cdredis-2.6.14

make

cd src && make install

3.移动文件,便于管理


redis-2.6.14/src# mv ../redis.conf /usr/local/redis/etc/

redis-2.6.14/src# mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin/



4.启动Redis服务器:



启动时要制指定一个配置文件,启动成功后画面如下:



Redis服务端的默认连接端口是6379

5.客户端连接:

chc@myDesk:~$ /usr/local/redis/bin/redis-cli
redis 127.0.0.1:6379>


6.停止Redis实例:

/usr/local/redis/bin/redis-cli shutdown或pkill redis-server

(ps -ef | grep redis查看redis服务进程;netstat -tunpl | grep 6379查看某一端口的占用情况)

7.Redis的配置:

daemonize 默认为no,如果需要在后台运行,把该项设为yes

pidfile配置多个pid的地址,默认在/var/run/redis.pid

bind 绑定IP,设置后只接受来自该IP的请求

port 监听端口,默认为6379

timeout 设置客户端连接时的超时时间,单位为秒

loglevel 分为4级,debug、verbose、notice、warning

logfile 配置log文件地址

databases 设置数据库的个数,默认使用的数据库为0

save 设置Redis进行数据库镜像的频率

rdbcompression 在进行镜像文件备份时,是否进行压缩

Dbfilename 镜像备份文件的文件名

Dir数据库镜像备份文件的放置路径

Slaveof 设置数据库为其他数据库的从数据库

Masterauth 主数据库连接时需要的验证密码

Maxclients 限制同时连接的客户数量

maxmemory 设置redis能够使用的最大内存

Appendonly 开启append only 模式

Appendfsync 设置对appendonly.aof文件同步的频率

va-enabled 是否开启虚拟内存支持

vm-swap-file 设置虚拟内存的交换文件位置

vm-max-memory 设置redis使用的最大物理内存大小

vm-page-size 设置虚拟内存的页大小

vm-pages 设置文件交换的总的page数量

va-max-threads 设置VMIO同时使用的线程数量

glueoutputbuf 把小的输出缓存存放在一起

Hash-max-zipmap-entries 设置hash的临界值

Activerehashing 重新hash

五、Redis的数据类型

1、String类型及操作

String是最简单的类型,一个key对应一个value,String类型是二进制安全的。Redis的string可以包含任何数据,比如jpg图片或者序列化的对象。

操作:

set 设置对应的值为string类型的value,如果键已存在则覆盖原有的值;

例如:添加一个name=chc的键值对

redis 127.0.0.1:6379> set nane chc

setnx 设置对应的值为string类型的value,如果key已经存在,则返回0,nx是not exst的意思

setex 设置对应的值为string类型的value,并指定此键值对应的有效期,如setex name 10 chc,10秒后name将消失

setrange 设置指定key的value值得子字符串;如,希望将xxx@126.com 替换为gmail邮箱,setrange email 4 gmail.com--->get email -->xxx@gmail.com

mset 一次设置多个key的值,成功返回ok表示所有的值都设置了;失败返回0表示没有任何值被设置。如mset name chc age 24 sex man

msetnx一次设置多个key的值,成功返回ok表示所有的值都设置了;失败返回0表示没有任何值被设置,但是不会覆盖已经存在的key。

get 获取key对应的string值,如果key不村子返回nil

getset设置key的值,并返回key的旧值

getrange 获取key的value值得子字符串,如getrange name 0 5

mget 一次性获取多个key的值,如果key不存在则对应返回nil

incr 对key的值做加加操作,并返回新的值。

incrby 同incr类似,加指定值,key不存在时会设置key,并认为原来value是0;

decr对key的值做减减操作;

decrby同decr类似,减指定值;

append 给指定key的字符串追加value,返回新字符串的长度;

strlen 取指定key的value值得长度;


2.hash类型及操作

Redis hash是一个string类型的field和value的映射表。它的添加、删除操作都是O(1)。hash特别适合于存储对象,相较于将对象的每个字段存成单个string类型,讲一个对象存储在hash类型中会占用更少的内存,并且可以哈、更方便的存取整个对象。

hset 设置hash field为指定值,如果key不存在则先创建;如hset myhash field1 hello;
hsetnx、hmset、hget、hmget、hincrby(如hincrby myhash age -2)、hexist(测试指定field是否存在,存在就返回1,否则返回0 )、hlen'(返回指定hash的field数量)

hdel(删除指定hash的field,删除成功返回1,否则返回0)、hkeys(返回hash所有的field)、hvals(返回hash的所有value)、hgetall(获取某个hash中全部的field及其value)


3.list类型及操作

List是一个链表结构,主要功能是pus、pop、获取一个范围的所有值等等,操作中的key理解为链表的名字。Redis的list类型起始就是一个每个子元素都是string类型的双向链表。我们可以通过push、pop操作从链表的头部或尾部添加删除元素,这样list既可以作为栈又可以作为队列。

lpush 在key对应list的头部添加字符串元素并返回list中的元素个数,如lpush mylist “hello”;

lrange lrange mylist headindex tailIndex;lrange mylist 0 -1;0代表头部第一个元素,-1代表尾部第一个元素

rpush 在key对应list的尾部添加字符串元素;

linsert 在key对应list的特定位置前或后添加字符串:(由尾到头方向为前 )


lset 设置list中指定下标的元素值,如rpush mylist “hello” , lset mylist 0 “world”;

lrem 从key对应list中删除n个和value相同的元素,返回删除的个数(n<0从尾部删,n=0全部删除);

ltrim 保留指定key的值范围内的数据,如ltrim mylist 2 -1


lpop 从list的头部删除元素,并返回删除的元素;

rpop 从list的部删除元素,并返回删除的元素

rpoplpush 从第一个list的尾部移除元素并添加到第二个list的头部:


lindex 返回名称为key的list中index位置的元素;


llen 返回list的长度;


4.set类型及其操作

set是集合,它是string类型的无序集合。set是通过hash table实现的,添加、删除和查找复杂度都是O(1)。对于集合我们可以取并集、交际、差集。通过这些操作我们可以实现sns中的好友推荐和blog的tag功能。

sadd 向名称为key的set中添加元素,set中已有的元素是加不进去的,加入成功返回1,否则返回0;

smembers 查看set下所有元素;

srem 删除set中的元素,删除成功返回1,否则返回0;

spop 随机返回输出set中的一个元素;

sdiff 返回所有给定key与第一个key的差集,如sdiff A B(即返回A-B,把A中有的而B中没有的元素返回):


sdiffstore A B C 将B与C的差集存到A中,且A是被重写的,以前A中的元素全被清空;

sinter 返回所有集合的交集;

sinterstore A B C 将B与C的集存到A中,且A是被重写的,以前A中的元素全被清空;

sunion 返回所有集合的并集;

sunionstore A B C 将B与C的并集存到A中,且A是被重写的,以前A中的元素全被清空;

smove setA setB member从第一个集合中移除member加到第二个集合中;

scard 返回集合中元素的个数;

sismember setA member 测试member是否是集合A中的元素,是就返回1,否则返回0;

srandmember 随机返回集合中的一个元素但不删除;


5.sorted set类型及操作

sorted set在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新安排新的值调整顺序。可以理解为有两列的MysqL表,一列存value,一列存顺序。操作中key理解为zset的名字。

zadd zsetA order member 向 向Zset中添加一个元素并指定其顺序:


zrange zsetA headindex tailindex withscores 将排序的序号也输出;

zrem、zincrby:


zrank 返回集合中元素的排名(按score从小到大排序)即下标:


zrevrank 返回集合中元素的排名(按score从大到小排序)即下标;

zrevrange 返回集合中的元素中的index从start到end的所有元素(按score从大到小排序);

zrangebyscore 返回集合中score从start到end的所有元素

zcount zsetA start end返回集合中score在给定区间的数量;

zcard 返回集合中元素的个数;

zremrangebyrank zsetA start end按下标来排序,然后删除给定下标区间里的元素;

zremrangebyscore zsetA start end 按score来排序,然后删除给定scor区间里的元素;


六、Redis的常用命令

1.键值相关命令

keys 返回满足给定pattern的所有key;表达式 * 表示取出所有的key;

exists 确认一个key是否存在,若存在返回1,否则返回0;

del 删除一个key,成功返回1,否则返回0;

expire 设置一个key的过期时间,以秒为单位,可用ttl 查看某个键还有多长时间过期,-1表示已经过期:


move 将当前数据库中的key转移到其他数据库中:

persist 移除给定key的过期时间;

randomkey 随机返回key空间里的一个key;

rename 重命名key,rename old new;

type 返回key的数据类型;


2.服务器相关命令

ping 测试连接是否存活;

echo 在命令行打印一些内容;

select 选择数据库,Redis数据库编号从0~15,可以选择任意一个数据库来进行数据的存取;

quit/exit/ctrl+c 退出连接;

dbsize 返回当前数据库中key的数目;

info 获取服务器的信息和统计;

config get [参数项名称] 获取某个参数项配置的值;

flushdb 删除当前数据库中的所有key;

flushall 删除所有数据库中的所有key;


七、Redis的高级实用特性

1.安全性

设置客户端连接后进行其他指定前需要使用的密码。

Warning:因为redis速度相当快,所以在一台比较好的服务器下,一个外部用户可以在一秒钟进行150K次的密码尝试,这意味着你需要指定非常强大的密码来防止暴力破解。

在配置文件redis-config中设置requirepass password,然后重启redis server:


2.主从复制

Redis主从复制配置和使用都非常简单。通过主从复制可以允许多个slave server拥有和master server相同的数据库副本。其特点如下:

1)master可以拥有多个slave

2)多个slave可以连接同一个master外,还可以连接到其他slave

3)主从复制不会阻塞master,在同步数据时,master可以继续处理client请求

4)可以提高系统的伸缩性

过程:

1)slave与master建立连接,发送sync同步命令

2)master会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存

3)后台保存完成后,就将此文件发送给slave

4)slave将此文件保存到硬盘

配置主从服务器:

只需在slave的配置文件中加入以下配置

slaveof IP Port #指定master的ip和端口

masterauth tiger #设置主机的密码

我使用的是在Oracle VM VirtualBox(虚拟机网络通信设置:http://www.xuebuyuan.com/830848.html)中的ubuntu虚拟机,然后复制了一份:


3.事务处理

Redis对事务的的支持目前还比较简单。Redis只能保证一个client发起的事务中的命令可以连续执行,而中间不会插入其他client的命令。当一个client在一个连接中发出multi命令时,这个链接会进入一个事务上下文,还连接后续的命令不会立即执行,而是先放到一个队列中,当执行exec命令时,redis会顺序执行队列中的所有命令。

------>>>>简单事务处理:


取消一个事务discard;队列中如果有一个命令执行出错,事务整体不会回滚。

乐观锁复杂事务控制:

乐观锁:大多数是基于数据版本的记录机制实现的。即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表添加一个version字段来实现,读取数据时,将此版本号一同读出,之后更新时,对此版本号加1.此时将提交数据的版本号与数据库表对应记录的当前版本号进行对比,如果提交数据的版本号大于数据库当前的版本号,则予以更新,否则认为是过期数据。

watch命令会调用监视给定的key,当exec时,如果监视的key从调用watch后发生改变,则整个事务会失败。也可以调用watch多次监视多个key。这样就可以对指定的key加乐观锁了。watch的key是对整个连接有效的,事务也一样。如果连接断开,监视和事务都会被自动清除。当然exec、discard、unwatch命令都会清楚连接中的所有监视。

4.持久化机制

Redis是一个支持持久化的内存数据库,即redis需要经常讲内存中的数据同步到硬盘来保证持久化。Redis支持两种持久化方式:

1)snapshotting(快照)也是默认方式--数据备份

快照方式是默认的持久化方式。这种方式是将内存中的数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置做自动快照持久化的方式。

我们可以配置redis在n秒内如果超过m个key被修改就自动做快照。如:

save 600 1 #600秒内如果超过1个key被修改,则发起快照保存;

由于快照方式是在一定时间间隔做一次,所以如果redis意外down掉的话,就会丢失最后一次快照的所有修改。

aof比快照方式有更好的持久性是由于在使用aof时,redis会将每一个收到写命令都通过write函数追加到文件中,当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。

2)Append-only file (缩写aof)的方式--将增删改操作存到文件中(类似于MysqL数据库的增量备份)

由于OS会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化还是有可能会丢失部分修改。可以通过配置文件告诉redis要通过fsync函数强制OS写入到磁盘的时机。

appendonly yes #启用aof持久化方式

appendfsync always #收到命令就立即写入磁盘,最慢,但是保证了完全的持久化
appendfsync everysec #每秒写入磁盘一次,在性能和持久化方面做了很好的折中
appendfsync no # 完全依赖OS,性能最好,持久化没保证

5.发布订阅消息

发布订阅(pub/sub)是一种消息通信模式,主要目的在于解除消息发布者和订阅者之间的耦合,Redis作为一个pub/sub的server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subscribe和psubscribe命令想redis server订阅自己感兴趣的消息类型,redis将消息类型称为通道。当发布者通过publish命令向redis server发送特定类型的信息时,订阅该信息类型的全部client都会收到此信息。

6.虚拟内存的实用

Redis的虚拟内存与操作系统的虚拟内存不是一回事,但是思路和目的都是相同的。就是把不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的内存空间用于其他需要访问的数据。尤其是对于redis这样的内存数据库,内存总是不够用。除了可以将数据分割到多个redis server外。另外能够提高数据库容量的办法就是使用虚拟内存把那些不经常访问的数据交换到磁盘上。

Nosql Redis学习

Nosql Redis学习

Redis: A persistent key-value database with built-in net interface written in ANSI-C for Posix systems.Redis是现在很火的高性能KV内存数据库,支持丰富的数据类型,支持持久化、数据同步等DB特性。Redis是开源的,代码量不大2W+,代码风格和实现都很值得学习。在开源的时代,模仿好代码估计是最快的学习方式。

使用

推荐如下资料:

Redis系统性介绍

一个很棒的Redis介绍PPT

Redis官方文档

实现

推荐如下资料:

Redis内存存储结构分析

Redis RDB文件格式全解析,英文:https://github.com/sripathikrishnan/redis-rdb-tools/wiki/Redis-RDB-Dump-File-Format

协议规范(Protocol specification)

Redis: under the hood

解密Redis持久化

Replication

Redis官方文档

可复用代码(版本2.6.3)

malloc封装():tcmalloc|jemalloc|libc 使用最佳的malloc封装,libc的malloc不提供获取分配内存大小的接口。

zmalloc.h,zmalloc.c

异步网络库:封装各种事件组件,提供统一的接口。

ae.c ae_epoll.c ae_evport.c ae.h ae_kqueue.c ae_select.c

TCP|UNIX网络封装: 很简单的封装。

anet.h,anet.c,syncio.c(阻塞式读写)

数据结构

adlist.h,adlist.c (通用双向链表),ziplist.h,ziplist.c,zipmap.h,zipmap.c,intset.h,intset.c(基于连续内存的小数据存储结构),sds.h,sds.c(Binary Safe字符串)

lzf压缩算法

lzf -- an extremely fast/free compression/decompression-method:http://liblzf.plan9.de/

lzf_c.c lzf_d.c lzf.h lzfP.h

文件读写: 封装基于文件和内存的数据读写。

rio.h,rio.c

工具

crc64.c,endianconv.h,endianconv.c(将大端数据转成小端,性能考虑),memtest.c(内存测试工具),pqsort.h,pqsort.c(部分快排),rand.h,rand.c,sha1.c,sha1.h(开源的sha),util.c,util.h(字符串匹配,字符串和整形数转换)

设计

灵活协议

Redis采用可读可组合的文本协议。Redis采用统一的命令格式,基于统一的规范命令Redis天生具备解析和执行多条命令的能力,因此Redis非常容易支持:批量命令、事务、原子操作(脚本原子操作)等。

权衡

Redis的设计需要做各种权衡,每一种权衡都意味着不同的实现方案、资源、性能的折中。Redis不可能适合所有的使用场景,作为KV的内存数据库,Redis做了很多针对性设计:高性能优先、高内存使用效率、多样的数据结构(内存易实现)、单线程读写(cpu非瓶颈)、数据快照(RDB文件)、可过期的数据,同时提供其他可配置的功能:AOF(日志)、可配置的小数据格式、主从Replication、严格内存限制或swap、LRU缓存、磁盘存储等。

小技巧

Redis Administration

FAQ

memory-optimization

其他资料

Redis资料汇总专题

NoSQL之Redis

NoSQL之Redis

文章目录

    • NoSQL之Redis
      • 一、关系数据库和非关系数据库
        • 1、关系型数据库
        • 2、非关系型数据库
        • 3、区别
          • 3.1 数据存储方式不同
          • 3.2 扩展方式不同
        • 4、非关系型数据的产生背景
        • 5、概念小结
      • 二、Redis简介
        • 1、Redis概述
        • 2、Redis应用场景
        • 3、Redis的优点
        • 4、Redis的缺点
        • **5、Redis和ElasticSearch的区别**
      • 三、Redis安装部署
        • 1、解压软件包
        • 2、源码编译安装
        • 3、设置Redis相关配置文件
      • 四、Redis常用工具
        • 1、Redis命令工具
        • 2、Redis-cli命令工具
        • 3、Redis-benchmark 测试工具

Nosql之Redis

一、关系数据库和非关系数据库

1、关系型数据库

  • 关系型数据库是一个结构化的数据库,创建在关系模型上(二维关系表模型)基础上
  • 一般面向于记录
  • 主流的关系型数据库包括orecle、MysqL、sql Server、Microsoft、DB2等
  • sql语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作

2、非关系型数据库

  • Nosql(Nosql=Not Only sql),意识是“不仅仅是sql”,是非关系型数据库的总称
  • 除了主流的关系型数据库外的数据库,都认为是非关系型
  • 主流的Nosql数据库有Redis、MongDB、Hbase、Memcached等

3、区别

3.1 数据存储方式不同

关系型和非关系数据库的主要差异就是数据存储的方式。

关系型数据天然就是表格形式,因此存储在数据表的行列中。

数据表可以彼此关联协作存储,也很容易提取数据。

与其相反,非关系型数据不适合存储在数据表的行和列中,而是大块组合在一起。

非关系型数据通常存储在数据集中,就像文档、键值对或者图结构。

你的数据及其特性是选择数据存储和提取方式的首要影响因素。

3.2 扩展方式不同
  • sql和Nosql数据库最大的差别可能是在扩展方式上,要支持日益增长的需求当然要扩展。
  • 需要支持更多并发量,sql数据库是纵向扩展,也就是说提高处理能力,使用更快速的计算机,这样处理相同的数据集就更快了。
  • 因为数据存储在关系表中,操作的性能瓶颈可能涉及很多个表,这都是需要通过提高计算机性能来克服。虽然sql数据库有很大扩展空间,但最终肯定会达到纵行扩展的上限。
  • 而Nosql数据库是横向扩展的。
  • 因为非关系数据存储天然就是分布式的,Nosql数据库的扩展可以通过给资源池添加更多普通的数据库服务器(节点)来分担负载。

4、非关系型数据的产生背景

  • 关系型数据库和非关系数据库都有各自的特点与应用场景,两者的紧密结合将会给Web2.0的数据库发展带来型的思路。

  • 关系数据库关注在关系上,非关系型数据库关主存储上。

  • 在读写分离的MysqL数据库环境中,可以把经常访问的数据存储在非关系数据库中,提高访问速度。

  • 需求驱动发展:

    • 对数据库高并发读写的需求。
    • 对海量数据高效存储与访问的需求。
    • 对数据库高扩展性和高可用性的需求。

5、概念小结

  • 关系型数据库:
    • 实例->数据库->表(table)->记录行(row)、数据字段(column)
  • 非关系型数据库:
    • 实例->数据库->集合(collection)->键值对(key-value)
  • 非关系型数据库不需要手动建数据库和集合(表)

二、Redis简介

1、Redis概述

Redis是一个开源的、使用C语言编写的Nosql数据库

Redis基于内存运行并支持持久化,采用key-value(键值对)的存储形式,是目前分布式架构中不可活缺的一环

Redis服务器程序是单进程模型,也就是说,在一台服务器上可以同时启动多个Redis进程,但Redis的实际处理速度则是完全依靠与主进程的执行效率

若在服务器上只运行一个Redis进程,但有多个客户端同时访问时,服务器的处理能力会有一定程度的下降

若在同一台服务器上开启多个Redis进程,Redis在提高并发处理能力的同时而会给服务器的cpu造成很大压力。

总结:在实际生产环境中,需要根据实际的需求来决定开启多少个Redis进程,若对高并发要求更高一些,可能会考虑在同一台服务器上开启多个Redis进程,而若cpu资源比较禁止,采用单进程使用。

2、Redis应用场景

1、热点数据缓存

热点数据(经常会被查询,但是不经常被修改或者删除的数据),由于redis访问速度快、支持的数据类型比较丰富,首选是使用redis缓存。

2、分布式锁

3、Redis的优点

具有极高的数据读写速度:数据读取的速度最高可达110000次/s,数据写入速度最高可达81000次/s。

支持丰富的数据类型:支持key-value、String、Lists、Hashes、Sets及Ordered Sets等数据类型操作。

支持数据的持久化:可以讲内存中更多数据保存在磁盘中,重启的时候可以再次加载进行使用

原子性:Redis所有操作都是原子性

支持数据备份:即master-salve模式的数据备份

Redis作为基于内存运行的数据库,缓存是其最常应用的场景之一
除此之外,Redis常见应用场景还包括获取最新N个数据的操作、排行榜类应用、计数器应用、存储关系、实时分析系统、日志记录。

4、Redis的缺点

  • 3.1 缓存和数据库双写一致性问题

在分布式环境下,缓存和数据库很容易出现数据一致性问题,如果项目对缓存的要求强一致性,那么不建议使用缓存。

在使用缓存中,使用策略降低缓存与数据库一致性的概率,是无法保障两者的强一致性,一般策略包括缓存更新机制,更新数据库后及时跟新缓存、缓存失败时增加重试机制等。

  • 3.2 缓存雪崩

缓存雪崩时指大量的应用请求无法在Redis缓存中进行处理,紧接着,应用将大量请求发送到数据库层,导致数据库层的压力激增。

具体解决方案思路:

  • **事故前:**redis高可用方案,主从+哨兵,集群方案,避免全盘崩溃。
  • 事故中:减少数据库压力,本地Ehcache缓存+限流及降级,避免超过数据库承受压力,实在不行,服务熔断。
  • **事故后:**做redis持久化,可以实现热点数据不丢失,造成请求缓存缺失。

原因有二:

原因一:缓存中有大量数据同时过期,导致大量请求无法得到处理。

在数据保存在缓存中,并且设置了过期时间,如果出现同一时间大量数据过滤器,又有请求范围这些数据,就会发送缓冲缺失,然后就会去请求数据库,重数据库中读取,如果应用的并发请求量很大,那么数据库的压力也就很大。

解决方法:

  • 避免给大量的数据设置相同的过期时间,设置随机的过期时间。
  • **通过服务器降级:**针对不同的数据采用不同的处理方式,当请求访问的时非核心数据时,暂时停止从缓冲查询数据,而是直接返回预定义值或空值等;当请求访问的是核心数据时,扔允许查询缓冲,如果缓冲缺失,可以继续通过数据库读取。

原因二:Redis缓冲实例发生故障宕机

解决方法:

  • 在业务系统中实现服务熔断:所谓服务熔断,是指发生缓冲雪崩时,为了防止发生连锁的数据库雪崩,导致整个系统的崩溃,我们暂停业务应用对缓冲系统的接口访问。直白点就是,缓冲接口不在把请求发给Redis缓冲实例,而是直接返回,等到Reids实例恢复后重启服务。

  • **请求限流机制:**不同于服务熔断,不会暂停整个缓冲系统的访问,请求限流,会在业务系统的请求入口前端控制每秒进入系统的请求数,避免过多的请求访问数据库,减少大量并发请求压力传递到数据库。

  • 事前预防:可以通过搭建Redis缓存主从集群(哨兵或集群模式),可以做到主从Redis缓存的切换,实现Reids服务不终断。

  • 3.3 缓存穿透

缓存穿透时指,用户发出大量访问缓存和数据库中没有的数据,导致请求直接查询数据库,这种行为会直接导致数据库挂掉。

两个原因:

  1. 业务层误操作:缓存中的数据和数据库中的数据被误删除了,所以缓存和数据库中都没有数据;
  2. 恶意攻击:专门访问数据库中没有的数据。

解决方法:

  • 在请求接口层可以进行校验(用户签名和授权,参数校验),拒绝不合法的请求。

  • 布隆过滤器:在控制层对请求先进行校验,不符合条件的请求则被丢弃,从而避免对持久层数据库造成的查询压力。

  • 缓存空对象:当查询的数据不存在于redis中时,请求到了持久层数据库中去查询数据,但查询不出数据,这时会返回空对象,同时把该空对象缓存到redis里,然后设置一个过期时间,往后只要再次请求查询该条数据,该条数据都会从redis中获取(获取redis返回的空对象),从而保护了后端的数据源。

  • 3.4 缓存击穿

redis缓存击穿概念是redis里的一个key非常热点,导致大并发集中对这个key不断的进行访问,当在这个key过期的瞬间,持续的大并发就会跳过缓存,直接作用在持久层数据库上,请求在访问持久层数据库查询数据的同时,持久层数据库也需要回写缓存,这时候就会导致持久层数据库瞬间压力过大导致服务器宕机,这种现象就叫做缓存击穿。

解决方法:

不同场景下缓存击穿解决方案:

  • 数据基本不变:热点数据value基本不更新时,可以设置成永不过期
  • 数据更新不频繁:缓存刷新流程耗时较少时,可采用redis、zookeeper等分布式中间件的分布式互斥锁或者本地互斥锁保证少量的请求能请求到数据库并重新更新缓存,其他的流程等锁释放后才可以访问新缓存
  • 数据更新频繁:采用定时线程,在缓存过期前主动重新构建缓存或延长过期时间,保证所有的请求能一直访问缓存

5、Redis和ElasticSearch的区别

三、Redis安装部署

1、解压软件包

Redis官网:https://redis.io/

  • 将下载好的软件包传至 /opt/ 目录下
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

yum -y install gcc gcc-c++ make

cd /opt
tar zxvf redis-5.0.7.tar.gz -C /opt/

2、源码编译安装

cd redis-5.0.7/
make -j 4
make PREFIX=/usr/local/redis install

#由于 Redis 源码包中直接提供了 Makefile 文件,所以在解压完软件包后,不用先执行./configure 进行配置
#可直接执行 make 与 make install 命令进行安装

3、设置Redis相关配置文件

cd /opt/redis-5.0.7/utils/

#执行软件包提供的 install_server.sh 脚本文件来设置 Redis 服务所需要的相关配置文件
./install_server.sh
......
Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server
#一直回车,直到出现以下选项,手动修改为“/usr/local/redis/bin/redis-server”
#注意,需要一次性正确输入,且输入错误了是无法更改的

image-20220818195928045

关键字 内容 说明
Port: 6379 默认侦听端口为 6379
Config file: /etc/redis/6379.conf 配置文件路径
Log file: /var/log/redis_6379.log 日志文件路径
Data dir /var/lib/redis/6379 数据文件路径
Executable: /usr/local/redis/bin/redis-server 可执行文件路径
Cli Executable: /usr/local/bin/redis-cli 客户端命令工具
ln -s /usr/local/redis/bin/* /usr/local/bin/
#把 redis 的可执行程序文件放入路径环境变量的目录中便于系统识别

netstat -natp | grep "redis"
#当 install_server.sh 脚本运行完毕,Redis 服务就已经启动,默认侦听端口为 6379

vim /etc/redis/6379.conf
#修改配置参数

bind 127.0.0.1 192.168.10.10       #70行,添加监听的主机地址
port 6379                           #93行,Redis 默认的监听端口
daemonize yes                       #137行,启用守护进程
pidfile /var/run/redis_6379.pid     #159行,指定 PID 文件
loglevel notice                     #167行,日志级别
logfile /var/log/redis_6379.log     #172行,指定日志文件

image-20220818200148655

image-20220818200520912

Redis 服务控制(命令行) 解释
/etc/init.d/redis_6379 stop 停止
/etc/init.d/redis_6379 start 启动
/etc/init.d/redis_6379 restart 重启
/etc/init.d/redis_6379 status 状态

四、Redis常用工具

1、Redis命令工具

命令行 解释
redis-server 用于启动Redis 的工具
redis- benchmark 用于检测Redis 在本机的运行效率
redis-check-aof 修复AOF持久化文件
redis-check-rdb 修复RDB 持久化文件
redis-cli Redis 命令行工具

2、Redis-cli命令工具

redis-cli -h host -p port -a password

image-20220818200926173

常用选项 解释
-h 指定远程主机
-p 指定 Redis 服务的端口号
-a 指定密码,未设置数据库密码可以省略此选项

若不添加任何选项表示,则使用 127.0.0.1:6379 连接本机上的 Redis 数据库。

3、Redis-benchmark 测试工具

redis-benchmark 是官方自带的 Redis 性能测试工具,可以有效的测试 Redis 服务的性能。

基本的测试语法:

redis-benchmark [选项] [选项值]
常用选项 解释
-h 指定服务器主机名
-p 指定服务器端口
-s 指定服务器 socket
-c 指定并发连接数
-n 指定请求数
-d 以字节的形式指定 SET/GET 值的数据大小
-k 1=keep alive,0=reconnect
-r SET/GET/INCR,使用随机 key,SADD 使用随机值
-p 通过管道传输请求
-q 强制退出 redis,仅显示 query/sec 值
–csv 以 CSV 格式输出
-l 生成循环,永久执行测试
-t 仅运行以逗号分隔的测试命令列表
-I Idle 模式,仅打开 N 个 idle 连接并等待
redis-benchmark -h 192.168.10.10 -p 6379 -c 100 -n 100000
#向 IP 地址为 192.168.126.15,端口为 6379 的 Redis 服务器发送 100 个并发连接与 100000 个请求以测试性能

redis-benchmark -h 192.168.10.10 -p 6379 -q -d 100
#测试存取大小为 100 字节的数据包的性能

redis-benchmark -t set,lpush -n 100000 -q
#测试本机上 Redis 服务在进行 set 与 lpush 操作时的性能

image-20220818201951633

image-20220818202031483

NoSQL之Redis - CentOS 6.5安装测试

NoSQL之Redis - CentOS 6.5安装测试

1.下载redis

可以在线安装或者下载redis

①在线安装前需要检测是否存在rpm包不存在的话查看yum在线是否存在rpm包不存在的话就只能手动下载或者用别的方式下载

[root@localhost~]#rpm-qa|grepredis
[root@localhost~]#yumlist|grepredis

说明不存在。

②去官网下载或者在线下载

wgethttp://redis.googlecode.com/files/redis-2.2.13.tar.gz

官网下载好的redis已经存在博客中了点击下载 redis


2.安装

由于是tar.gz格式的所以需要解压安装

下载好之后查找下载文件所在路径

[root@localhost~]#whereisredis
redis:/etc/redis
[root@localhost~]#

解压编译redis的软件包需要有gcc环境

总之缺少什么安装什么。

tar-zxvfreids-2.8.13.tar.gz
cdredis-2.8.13
make
sudomakeinstall
#配置开始---
编译完成后在Src目录下有四个可执行文件redis-server、redis-benchmark、redis-cli和redis.conf。然后拷贝到一个目录下。
mkdir/usr/redis
cpredis-server/usr/redis
cpredis-benchmark/usr/redis
cpredis-cli/usr/redis
cpredis.conf/usr/redis
cd/usr/redis
#配置结束--

或者可以这样配置

mkdir/etc/redis
cpredis.conf/etc/redis/redis.conf
mkdir/var/lib/redis

可从此处下载修改好的 redis.conf

启动redis
redis-server/etc/redis/redis.conf
#即可在后台启动redis服务确认运行了之后可以用redis-benchmark命令测试看看还可以通过redis-cli命令实际操作一下比如
#install的时候redis的命令会被拷贝到/usr/local/bin下面


3.测试

客户端测试一下是否启动成功

[root@localhostsrc]#ps-aux|grepredis
Warning:badSyntax,perhapsabogus'-'?See/usr/share/doc/procps-3.2.8/FAQ
root232660.00.71373567768?Sl00:230:04redis-server*:6379
root239820.00.5194045100pts/0S+01:090:00redis-cli
root243980.00.0103244876pts/2S+01:440:00grepredis
[root@localhostsrc]#redis-cli
127.0.0.1:6379>setwwang
OK
127.0.0.1:6379>getw
"wang"
127.0.0.1:6379>

4.关闭服务

redis-clishutdown
如果端口变化可以指定端口:
redis-cli-p6379shutdown
127.0.0.1:6379>i+j
CouldnotconnecttoRedisat127.0.0.1:6379:Connectionrefused
notconnected>setw3
CouldnotconnecttoRedisat127.0.0.1:6379:Connectionrefused
notconnected>

5.启动服务

[root@localhostsrc]#redis-server
[24502]28Oct01:54:35.784#Warning:noconfigfilespecified,usingthedefaultconfig.Inordertospecifyaconfigfileuseredis-server/path/to/redis.conf
[24502]28Oct01:54:35.784*Increasedmaximumnumberofopenfilesto10032(itwasoriginallysetto1024).
_._
_.-``__''-._
_.-```.`_.''-._Redis2.8.13(00000000/0)64bit
.-``.-```.```\/_.,_''-._
(',.-`|`,)Runninginstandalonemode
|`-._`-...-`__...-.``-._|'`_.-'|Port:6379
|`-._`._/_.-'|PID:24502
`-._`-._`-./_.-'_.-'
|`-._`-._`-.__.-'_.-'_.-'|
|`-._`-.__.-'_.-'|http://redis.io
`-._`-._`-.__.-'_.-'_.-'
|`-._`-._`-.__.-'_.-'_.-'|
|`-._`-.__.-'_.-'|
`-._`-._`-.__.-'_.-'_.-'
`-._`-.__.-'_.-'
`-.__.-'
`-.__.-'
[24502]28Oct01:54:35.786#Serverstarted,Redisversion2.8.13
[24502]28Oct01:54:35.786#WARNINGovercommit_memoryissetto0!Backgroundsavemayfailunderlowmemorycondition.Tofixthisissueadd'vm.overcommit_memory=1'to/etc/sysctl.confandthenrebootorrunthecommand'sysctlvm.overcommit_memory=1'forthistotakeeffect.
[24502]28Oct01:54:35.786*DBloadedfromdisk:0.000seconds
[24502]28Oct01:54:35.786*TheserverisNowreadytoacceptconnectionsonport6379

启动之后最好重新打开个窗口运行redsi-cli进入控制台

否则可能出现连接错误。和windows下cmd运行tomcat类似。

[root@localhostredis]#redis-cli
CouldnotconnecttoRedisat127.0.0.1:6379:Connectionrefused
notconnected>redis-cli
CouldnotconnecttoRedisat127.0.0.1:6379:Connectionrefused
notconnected>
[root@localhostredis]#redis-cli
127.0.0.1:6379>setname=wangxin
(error)ERRSyntaxerror
127.0.0.1:6379>setnamewangxin
OK
127.0.0.1:6379>setage26
OK
127.0.0.1:6379>getnameage
(error)ERRwrongnumberofargumentsfor'get'command
127.0.0.1:6379>getname
"wangxin"
127.0.0.1:6379>getage
"26"
127.0.0.1:6379>

NoSQL之Redis 高可用性集群方案,应急维护技巧

NoSQL之Redis 高可用性集群方案,应急维护技巧

连上从库,做save操作。将会在从库的data目录保存一份从库最新的dump.rdb文件。将这份dump.rdb文件拷贝到主库的data目录下。再重

前提:现在有主从结构,主库没有配置持久化,从库配置aof。(主库用来备份和写服务,从库用来提供读服务)

场景:哪天主库突然宕了,怎么办?

方法:连上从库,做save操作。将会在从库的data目录保存一份从库最新的dump.rdb文件。将这份dump.rdb文件拷贝到主库的data目录下。再重启主库。

就因为这个我想到了用集群的方案,但是redis官方没有mysql那样的master-

master的模式~  这样的情况下,只能咱们自己想办法了~

实现的原理~

当 Master 与 Slave 均运作正常时, Master负责读,Slave负责同步;

当 Master 挂掉,Slave 正常时, Slave接管服务,同时关闭主从复制功能;

然后依次循环。

这样,两台redis服务器中的任何一台挂掉,都会由另一台继续提供服务,不会对网站形成可察觉的影响,也不会丢失数据。

你也可以实现当 Master 恢复正常,则从Slave同步数据,同步数据之后关闭主从复制功能,恢复Master身份,于此同时Slave等待Master同步数据完成之后,恢复Slave身份。

高可用方面

需要把读写进行分离的,,写的话,就指向到一个vip~ 那两个主 用keepalived加脚本进行判断。

读的话,尽量用haproxy进行分流,这样的话,哪怕一个从down的话,haproxy会自动剔除的~

redis安装~

keepalived的安装~

 

安装完之后,具体说下高可用性的部分,下面是 的keepalived.conf 的配置文件~

killall -0 redis-server 来判断进程的存活~

也可以用checkredis.sh 这个脚本~

【大家可以写简单点~】 这个方法是redis自带的一个判断服务存活的程序

linux

关于NOSQL之Redis学习札记nosql redis的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Nosql Redis学习、NoSQL之Redis、NoSQL之Redis - CentOS 6.5安装测试、NoSQL之Redis 高可用性集群方案,应急维护技巧的相关知识,请在本站寻找。

本文标签: