20171014redis

云计算 waitig 375℃ 百度已收录 0评论

Redis技术
NoSQL介绍
NoSQL是以key-value形式存储,它不一定遵循传统数据库的一些基本要求,比如说遵循SQL标准、ACID属性、表结构等等。相比传统数据库,叫它分布式数据管理系统更贴切,数据存储被简化更灵活,重点被放在了分布式数据管理上。
几种主流的NoSQL数据库
– BigTable
– Hbase
– Redis
– MongoDB

Redis介绍
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,并且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcacheed一样,为了保证效率,数据都是缓存到内存中,区别是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
相比memcached的优势:
–value类型更丰富
–数据操作方法更多
–可将内存数据持久化到硬盘

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。
 Redis能运行在大多数POSIX(Linux, *BSD, OS X 和Solaris等)系统上,官方没有支持Windows的版本。目前最新的版本是2.8.14,这个版本主要是修复了一个2.2.7版本中遍历方式优化带来的一个bug。
和普通的Key-Value结构不同,Redis的Key支持灵活的数据结构,除了strings,还有hashes、lists、 sets 和sorted sets等结构。正是这些灵活的数据结构,丰富了Redis的应用场景,能满足更多业务上的灵活存储需求。
Redis的数据都保存在内存中,而且底层实现上是自己写了epoll event loop部分,而没有采用开源的libevent等通用框架,所以读写效率很高。为了实现数据的持久化,Redis支持定期刷新(可通过配置实现)或写日志的方式来保存数据到磁盘。
提供的API语言包括:C、C++、C#、Clojure、Common Lisp、Erlang、Haskell、Java、Javascript、Lua、Objective-C、Perl、PHP、Python、Ruby、Scala、Go、Tcl。

Redis的应用场景
目前全球最大的Redis用户腾讯微博、新浪微博,在新浪有200多台物理机,400多个端口运行着Redis,有+5G的数据在redis上来为微博用户提供服务。另外Redis常用的功能还有:
(1)、取最新N个数据的操作
(2)、排行榜应用,取TOP N操作
(3)、需要精准设定过期时间的应用
(4)、计数器应用
(5)、Uniq操作,获取某段时间所有数据排重值
(6)、实时系统,反垃圾系统
(7)、Pub/Sub构建实时消息系统
(8)、构建队列系统
(9)、缓存

Redis的安装与部署

步骤一:编译安装
下载redis-2.8.13.tar.gz到任意目录

tar -xvf redis-2.8.13.tar.gz,比如/usr/local/redis-2.8.13

mv redis-2.8.13 redis

cd /usr/local/redis

yum install -y gcc g++ gcc-c++ make

make

make install

拷贝文件

cp redis.conf /etc/ 这个文件时redis启动的配置文件

cp redis-benchmark redis-cli redis-server /usr/bin/ #这个倒是很有用,这样就不用再执行时加上./了,而且可以在任何地方执行。

注意事项:linux版本为32位,使用#make CFLAGS=”-march=i686”

步骤二:启动Redis服务

cd src/

./redis-server ../redis.conf

Redis服务器默认端口号:6379
启动前修改redis.conf的daemonize yes –守护进程启动

步骤三:测试是否安装成功
客户端连接 #./redis-cli -h IP -p Port
本机客户端操作#./redis-cli

192.168.126.128:6379> set name haobao
OK
192.168.126.128:6379> get name
“haobao”

步骤四:关闭Redis

./redis-cli shutdown

redis服务关闭后,缓存数据会自动dump到硬盘上,硬盘地址为redis.conf中的配置项dbfilename dump.rdb所设定
强制备份数据到磁盘,使用如下命令:

redis-cli save 或者 redis-cli -p 6380 save(指定端口)

Redis配置文件介绍
使用配置文件启动:src/redis-server redis.conf
主要配置项:
Redis支持很多的参数,但都有默认值。
  ●daemonize:
  默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yes。
  ●pidfile
  当Redis在后台运行的时候,Redis默认会把pid文件放在/var/run/redis.pid,你可以配置到其他地址。当运行多个redis服务时,需要指定不同的pid文件和端口。
  ●bind
  指定Redis只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求,在生产环境中最好设置该项。
  ●port
  监听端口,默认为6379。
  ●timeout
  设置客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接。
  ●loglevel
  log等级分为4级,debug, verbose, notice, 和warning。生产环境下一般开启notice。
  ●logfile
  配置log文件地址,默认使用标准输出,即打印在命令行终端的窗口上。
  ●databases
  设置数据库的个数,可以使用SELECT 命令来切换数据库。默认使用的数据库是0。
  
●save
  设置Redis进行数据库镜像的频率。
  if(在60秒之内有10000个keys发生变化时){
  进行镜像备份
  }else if(在300秒之内有10个keys发生了变化){
  进行镜像备份
  }else if(在900秒之内有1个keys发生了变化){
  进行镜像备份
  }
●rdbcompression
  在进行镜像备份时,是否进行压缩。
●dbfilename
  镜像备份文件的文件名。
●dir
  数据库镜像备份的文件放置的路径。这里的路径跟文件名要分开配置是因为Redis在进行备份时,先会将当前数据库的状态写入到一个临时文件中,等备份完成时,再把该该临时文件替换为上面所指定的文件,而这里的临时文件和上面所配置的备份文件都会放在这个指定的路径当中。
●slaveof
  设置该数据库为其他数据库的从数据库。
●masterauth
  当主数据库连接需要密码验证时,在这里指定。
●requirepass
  设置客户端连接后进行任何其他指定前需要使用的密码。警告:因为redis速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行150K次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解。
●maxclients
  限制同时连接的客户数量。当连接数超过这个值时,redis将不再接收其他连接请求,客户端尝试连接时将收到error信息。
●maxmemory
  设置redis能够使用的最大内存。当内存满了的时候,如果还接收到set命令,redis将先尝试剔除设置过expire信息的key,而不管该key的过期时间还没有到达。在删除时,将按照过期时间进行删除,最早将要被过期的key将最先被删除。如果带有expire信息的key都删光了,那么将返回错误。这样,redis将不再接收写请求,只接收get请求。maxmemory的设置比较适合于把redis当作于类似memcached的缓存来使用。
●appendonly
  默认情况下,redis会在后台异步的把数据库镜像备份到磁盘,但是该备份是非常耗时的,而且备份也不能很频繁,如果发生诸如拉闸限电、拔插头等状况,那么将造成比较大范围的数据丢失。所以redis提供了另外一种更加高效的数据库备份及灾难恢复方式。开启append only模式之后,redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态。但是这样会造成appendonly.aof文件过大,所以redis还支持了BGREWRITEAOF指令,对appendonly.aof进行重新整理。所以我认为推荐生产环境下的做法为关闭镜像,开启appendonly.aof,同时可以选择在访问较少的时间每天对appendonly.aof进行重写一次。
●appendfsync
  设置对appendonly.aof文件进行同步的频率。always表示每次有写操作都进行同步,everysec表示对写操作进行累积,每秒同步一次。这个需要根据实际业务场景进行配置。
●vm-enabled
  是否开启虚拟内存支持。因为redis是一个内存数据库,而且当内存满的时候,无法接收新的写请求,所以在redis 2.0中,提供了虚拟内存的支持。但是需要注意的是,redis中,所有的key都会放在内存中,在内存不够时,只会把value值放入交换区。这样保证了虽然使用虚拟内存,但性能基本不受影响,同时,你需要注意的是你要把vm-max-memory设置到足够来放下你的所有的key。
●vm-swap-file
  设置虚拟内存的交换文件路径。
  ●vm-max-memory
  这里设置开启虚拟内存之后,redis将使用的最大物理内存的大小。默认为0,redis将把他所有的能放到交换文件的都放到交换文件中,以尽量少的使用物理内存。在生产环境下,需要根据实际情况设置该值,最好不要使用默认的0。
  ●vm-page-size
  设置虚拟内存的页大小,如果你的value值比较大,比如说你要在value中放置博客、新闻之类的所有文章内容,就设大一点,如果要放置的都是很小的内容,那就设小一点。
  ●vm-pages
  设置交换文件的总的page数量,需要注意的是,page table信息会放在物理内存中,每8个page就会占据RAM中的1个byte。总的虚拟内存大小 = vm-page-size * vm-pages。
●vm-max-threads
  设置VM IO同时使用的线程数量。因为在进行内存交换时,对数据有编码和解码的过程,所以尽管IO设备在硬件上本上不能支持很多的并发读写,但是还是如果你所保存的vlaue值比较大,将该值设大一些,还是能够提升性能的。
  ●glueoutputbuf
  把小的输出缓存放在一起,以便能够在一个TCP packet中为客户端发送多个响应,具体原理和真实效果我不是很清楚。所以根据注释,你不是很确定的时候就设置成yes。
  ●hash-max-zipmap-entries
  在redis 2.0中引入了hash数据结构。当hash中包含超过指定元素个数并且最大的元素没有超过临界时,hash将以一种特殊的编码方式(大大减少内存使用)来存储,这里可以设置这两个临界值。
  ●activerehashing
  开启之后,redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用。当你的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存。

Redis数据类型
作为Key-value型数据库,Redis也提供了键(Key)和键值(Value)的映射关系。但是,除了常规的数值或字符串(Strings),Redis的键值还可以是以下形式之一:
  ●Lists (列表)
  ●Sets (集合)
  ●Sorted sets (有序集合)
  ●Hashes (哈希表)
  键值的数据类型决定了该键值支持的操作。Redis支持诸如列表、集合或有序集合的交集、并集、查集等高级原子操作;同时,如果键值的类型是普通数字,Redis则提供自增等原子操作。

Redis常用命令(Strings类型及操作)
string是最简单的类型,你可以理解成与Memcached是一模一样的类型,一个key对应一个value,其上支持的操作与Memcached的操作类似。但它的功能更丰富。
  string类型是二进制安全的。意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。从内部实现来看其实string可以看作byte数组,最大上限是1G字节

常用命令:
Set setnx setex setrange
Mset msetnx get getset
Getrange mget incr incrby
Decr decrby append strlen

Redis常用命令(Hashes类型及操作)
Redis hash是一个string类型的field和value的映射表.它的添加、删除操作都是O(1)(平均)。hash特别适合用于存储对象。相较于将对象的每个字段存成单个string类型。将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。
常用命令如下:
Hset hsetnx hmset hget
Hmget hincrby hexists hlen
Hdel hkeys hvals hgetall

Redis常用命令(Lists类型及操作)
list类型其实就是一个每个子元素都是string类型的双向链表。链表的最大长度是(2的32次方)。我们可以通过push,pop操作从链表的头部或者尾部添加删除元素。这使得list既可以用作栈,也可以用作队列。
list的pop操作还有阻塞版本的,当我们[lr]pop一个list对象时,如果list是空,或者不存在,会立即返回nil。但是阻塞版本的b[lr]pop可以则可以阻塞,当然可以加超时时间,超时后也会返回nil。为什么要阻塞版本的pop呢,主要是为了避免轮询。举个简单的例子如果我们用list来实现一个工作队列。执行任务的thread可以调用阻塞版本的pop去获取任务这样就可以避免轮询去检查是否有任务存在。当任务来时候工作线程可以立即返回,也可以避免轮询带来的延迟。
常用命令:
Lpush rpush linsert lset
Lrem ltrim lpop rpop
Rpoplpush lindex llen

Redis常用命令(Sets类型及操作)
set是string类型的无序集合。set元素最大可以包含(2的32次方)个元素。
set的是通过hash table实现的,所以添加、删除和查找的复杂度都是O(1)。除了基本的添加删除操作,其他有用的操作还包含集合的取并集(union),交集(intersection),差集(difference)。通过这些操作可以很容易的实现sns中的好友推荐和blog的tag功能。
常用命令:
Sadd srem spop sdiff
Sdiffstore sinter sinterstore sunion
Sunionstore smove scard sismember
srandmember

Redis常用命令(Sorted Sets类型及操作)
Sorted set是set的一个升级版,sorted set也是string类型元素的集合,不同的是每个元素都会关联一个double类型的score,sorted set的实现是skip list和hash table的混合体。
当元素被添加到集合中时,一个元素到score的映射被添加到hash table中,所以给定一个元素获取score的开销是O(1),另一个score到元素的映射被添加到skip list,并按照score排序,所以就可以有序的获取集合中的元素。添加,删除操作开销都是O(log(N))和skip list的开销一致,redis的skip list实现用的是双向链表,这样就可以逆序从尾部取元素。sorted set最经常的使用方式应该是作为索引来使用.我们可以把要排序的字段作为score存储,对象的id当元素存储。可以想象为两列,一存列值,一列存序号。
常用命令:
Zadd zrem zincrby zrank
Zrevrank zrevrange zrangebyscore
Zcount zcard zscore
Zremrangebyrank zremrangebyscore

Redis高级应用
安全性
主从复制
事务处理
持久化机制
发布订阅消息 sbusribe publish操作
虚拟内存的使用

Redis高级应用—安全性
Redis设置密码,防止暴力破解,密码最好设置健壮些。
Redis.conf中配置

requirepass foobared

requirepass zhongke --设置密码为zhongke

设置密码后,需要授权密码:

auth zhongke
链接客户端时输入密码:

./redis-cli –a dianxin

Redis高级应用–主从复制
Master 可以有多个slave
多个slave可以连接同一个master,还可以连接其他slave
主从复制不会阻塞master,在同步数据时,master可以继续处理client请求

配置主从服务器:
只需要在slave的配置文件中加入以下配置:
slaveof 192.168.1.20 6379 –指定master的ip和端口
masterauth zhongke –主机授权密码

Redis高级应用—事务处理
事务操作命令

redis-cli

redis 127.0.0.1:6379> multi –打开上下文,开启事务
redis 127.0.0.1:6379> incr t1
QUEUED
redis 127.0.0.1:6379> set name zhangsan
QUEUED
redis 127.0.0.1:6379> exec –提交事务
(integer) 1
2) OK

如何取消一个事务
redis 127.0.0.1:6379>discard –该命令可以取消事务,又称事务回滚

Redis高级应用—持久化机制
Redis支持两种持久化方式:
Snapshotting(快照)默认方式
save 900 1 –900秒内超过1个key被修改,则保存
save 300 10 –300秒内超过10个key被修改,则保存
save 60 10000
快照内容会存储到dump.rdb默认文件中。
append-only file(缩写aof)的方式
Aof比快照方式有更好的持久化行,它会把每次命令操作写到文件中。
Appendonly yes –启动aof持久化方式

appendonly always –收到命令就写磁盘,效率最慢

Appendonly everysec –每秒钟写入磁盘一次,性能折中

appendonly no –完全依赖os,性能最好,持久化没保证

port 7000
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

./redis-trib.rb create –replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

1.安装curl
sudo yum install curl
2. 安装RVM
curl -L get.rvm.io | bash -s stable 
3. 
source /usr/local/rvm/scripts/rvm
4. 查看rvm库中已知的ruby版本
rvm list known
5. 安装一个ruby版本
rvm install 2.3.3
6. 使用一个ruby版本
rvm use 2.3.3
7. 设置默认版本
rvm remove 2.0.0
8. 卸载一个已知版本
ruby –version
9. 再安装redis就可以了
gem install redis


本文由【waitig】发表在等英博客
本文固定链接:20171014redis
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)