一点一滴成长

导航

Redis安装

1、概况

  redis是NoSql的一种,NoSql即non-relational Sql(也有称为Not Only Sql),非关系型数据库,数据之间无关系,它不能替代关系型据库。

  NoSql有以下4种分类:键值(Key - Value)存储数据库、列存储数据库、文档型数据库、图形(Graph)数据库,Redis属于第一种:键值存储数据库。

  相对于memcache,redis支持更多的存储类型(除了string外,还有list、set、sortedset、map),而且支持持久化。

  redis实现数据持久化有两种方式:截图的方式,将内存中的数据不断写入磁盘(性能高,但可能会引起一定程度的数据丢失)。使用类似mysql的方式,记录每次更新的日志。

  所有 Redis 的操作都是原子,从而确保当两个客户同时访问 Redis 服务器得到的是更新后的值(最新值)。

  Redis可以为每个键设置生存时间(TTL,Time To Live),生存时间到期键会被自动删除。

  Redi支持“发布/订阅”的消息模式,可以基于此构建多人聊天、订阅更新等。

  Redis作为缓存的应用场景是最多的,如数据查询、短连接、新闻内容、商品内容等,还有分布式集群架构中的session分离、聊天室的在线好友列表,应用排行榜、网站访问统计、数据过期处理(可以精确到毫秒)、秒杀、抢购、12306等等。

  Redis的列表类型键可以用来实现队列,支持阻塞式读取,所以可以很容易的实现一个高性能的优先级队列。

  Redis功能总结:

2、安装与启动

  官网下载后使用tar -xzf解压(解压后可以阅读readme文件来查看redis安装的相关事项),进入解压后的目录,执行make命令进行编译,执行make PREFIX=../ install 来进行安装(PREFIX指定安装目录,会安装到指定目录的bin目录下),因为安装的时候是进入的redis目录下的src目录,所以这里指定安装到src目录的上级目录,即刚才解压的redis目录的bin目录。

redis/bin目录下的几个文件说明:
  redis-benchmark:redis性能测试工具   redis-check-aof:检查aof日志的工具   redis-check-dump:检查rdb日志的工具   redis-cli:连接用的命令行客户端   redis-server:redis服务进程

  启动有两种方式,前端启动和后台启动:

    ①、进入bin目录,执行程序 ./redis-server,默认使用端口6379(可以通过--port来指定端口),关闭的话可以在当前窗口下输入ctrl+c来强制关闭,或者另起一个窗口执行./redis-cli shutdown,通过客户端发消息来让服务端关闭。

    ②、后台启动的话需要一个配置文件来配置redis的启动,可以将redis目录下的redis.conf文件复制到bin目录下,使用vim修改redis.conf下的daemonize的值为yes。最后也是进入bin目录,执行./redis-server redis.conf来开启后台运行。关闭后台redis服务的话可以使用kill-9 redis进程ID来关闭,或者执行./redis-cli shutdown通过客户端来关闭服务端。

Redis.conf的配置:
  daemonize:如需要在后台运行(守护进程模式),把该项的值改为yes
  pdifile:把pid文件放在/var/run/redis.pid,可以配置到其他地址
  bind:指定redis只接收来自该IP的请求,如果不设置,那么将处理所有请求,在生产环节中最好设置该项
  port:监听端口,默认为6379
  timeout:设置客户端连接时的超时时间,单位为秒
  loglevel:等级分为4级,debug,revbose,notice和warning。生产环境下一般开启notice
  logfile:配置log文件地址,默认使用标准输出,即打印在命令行终端的端口上
  database:设置数据库的个数,默认使用的数据库是0
  save:设置redis进行数据库镜像的频率
  rdbcompression:在进行镜像备份时,是否进行压缩
  dbfilename:镜像备份文件的文件名
  dir:数据库镜像备份的文件放置的路径(持久化文件存放路径)
  slaveof:设置该数据库为其他数据库的从数据库
  masterauth:当主数据库连接需要密码验证时,在这里设定
  requirepass:设置客户端连接后进行任何其他指定前需要使用的密码
  maxclients:限制同时连接的客户端数量
  maxmemory:设置redis能够使用的最大内存
  appendonly:开启appendonly模式后,redis会把每一次所接收到的写操作都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态
  appendfsync:设置appendonly.aof文件进行同步的频率
  vm_enabled:是否开启虚拟内存支持
  vm_swap_file:设置虚拟内存的交换文件的路径
  vm_max_momery:设置开启虚拟内存后,redis将使用的最大物理内存的大小,默认为0
  vm_page_size:设置虚拟内存页的大小
  vm_pages:设置交换文件的总的page数量
  vm_max_thrrads:设置vm IO同时使用的线程数量

3、客户端命令

  客户端可以向redis服务发送命令,执行客户端的话默认是连接127.0.0.1:6379,可以通过-h指定服务的地址,-p指定服务的端口,如redis-cli -h 192.168.100.10 -p 6400 shutdown。发送命令有两种方式:①、一次性交互:redis-cli + 命令参数,如redis-cli Ping可以测试Redis服务是否正常,正常的话会受到PONG回复。②、进入交互模式:执行redis-cli打开客户端后即进入与服务交互模式,然后可以输入一条命令后等待服务恢复,然后接着输入其它命令。  

  一般情况下,redis执行一条命令后会返回状态结果/命令返回值,其中共有5种返回值类型:

    ①、状态回复,如发送SET命令设置某个键的值后,redis返回OK表示成功。

    ②、字符串回复,如GET命令返回某个键值。当请求列表类型值的时候,会返回多行字符串。字符串回复以双引号包裹,当请求的键值不存在显示(nil)。多行字符串回复以星号开头,$符后面数字为本行字符串长度,如下面为LRANGE命令的多行回复:

            

    ③、错误回复,当命令有误的时候会返回错误信息。

    ④、整数回复,Redis存储中没有整数类型,但有一些获得整数回复(以"(integer)"开头)的命令,如DBSIZE命令获得当前数据库中键的数量,INCR命令会设置键值递增并返回递增后的值(键不存在则创建键,默认键值为0)。

      

   CONFIG SET命令可以在不重启redis的情况下动态修改redis的配置,如CONFIG SET loglevel warning,CONFIG GET可以获得当前配置,如CONFIG GET loglevel。

  Redis默认提供了16个数据库来存储数据,可以通过配置参数databases来修改个数。默认自动选择0号数据库,可以随时通过SELECT命令更换数据库,如SELECT 1。所有的数据库共享Redis的访问密码,FULSHALL命令可以清空所有数据库中的数据,所以各个数据库之间并不是完全隔离的,所以可以拿0号数据库来存储应用的测试数据,拿1号数据库存储同一应用的正式数据,而对于不同应用的数据应该使用不同的redis实例。

  增:SET foo 1,设置键foo值为1,foo不存在则创建。

         SET foo 1 PX 1000,设置键foo值为1,过期时间为1000毫秒,到期自动删除该键(秒的话使用EX,如SET foo 1 EX 1)。

         PSETEX foo 1000 1:相当于是 SET foo 1 PX 1000。

         SETNX foo 1,foo不存在则创建其值为1并返回1,foo存在的话直接返回0。

         SET foo 1 NX:foo不存在才创建其值为1,相当于是SETNX命令(推荐使用这种方式来实现SETNX,因为SETNX被Redis声明为以后可能会被废除)。

         SET foo 1 NX PX 1000:foo不存在才创建其值为1,并且设置过期时间为1000毫秒(超过1000毫秒没有调用DEL删除foo的话自动删除foo)

         LPUSH foo 1,增加foo列表的一个值,foo不存在就创建。

  删:DEL foo bar,删除键foo和bar,DEL不支持通配符,删除以"user:"开头的键可以执行 reids-cli DEL ' redis-cli KEYS "user:*" ',也可以配合linux的管道和xargs命令实现:redis-cli KEYS "user:*" | xargs reids-cli DEL。

  改:同增。

  查:GET foo,获得键foo的值。

         EXISTS foo,判断foo键是否存在,存在返回1,否则返回0。

         KEYS * 获得所有健名,KEYS支持glob格式通配符,如:KEYS a? 获得所有以a开头的两个字符长度的键名,KEYS a[b-d] 获得ab或者ac或者ad键名,KEYS a\?[1-2]获得a?1或者a?2健名。下面是glob风格通配符规则:

               

 

         TYPE foo,获得键值的数据类型,如string,hash,list、set、zset。

   

  由上可以看出,redis中数据库为最小存储格局,没有“表”的概念,我们可以在创建健名的时候建议使用 "对象类型:对象ID:对象属性" 来命名一个键,这样的键名更具有唯一性,如user:101:friends表示用户ID为101的好友列表,再比如微博用户有关注和被关注,那就可以设置两个键:user:用户ID:guan_zhu,user:用户ID:fen_si。另外,健名包含多个单词的话也可以使用 "."来分隔 ,如使用“post:文章ID:page.view”来作为文章访问量的健名,相当于是“post:文章ID:PageView”。在保持健名直观性的情况下,可以适当精简健名以缩小Redis的内存占用,对于键值也应该做到精简来减小内存支出。

  Redis的命令操作都是原子操作,所以SET等操作都是线程安全的,因为Redis是单线程的,虽然Redis 6.0里面,增加了多线程的模型,但是增加的多线程只是用来处理网络IO事件,对于指令的执行过程,仍然是由主线程来处理。但是在使用多个命令的时候就要注意是否会出现竞态条件。比如我们先GET了个foo键的值,然后判断它为true的话执行A,为false的话执行B,很有可能在我们GET完后foo的值就被其它客户端改变了。再比如说我们自己实现INCR命令的话,先使用GET命令获得值为5,然后将值+1,即再通过SET命令将键值设为6,但如果是两个客户端同时使用GET获得值为5的话,那么本来最后的值应该为7,可实际上为6。这种竞态条件可以通过分布式锁或者事务和脚本来实现自定义的原子操作。

4、安全相关

  生产环境中应该通过中转程序来连接Redis服务,而不是外界直接连接Redis,添加配置项 bind 127.0.0.1 后,Redis只允许本机程序连接,想要外网能连接的话就bind 本机外网地址,想要既能本机访问又能外网访问的话bind 127.0.0.1 本机外网地址。

  通过配置文件的requirepass来为Redis设置一个密码,如requirepass 123456,发送密码使用AUTH命令,如AUTH 123456。Redis主从复制的时候如果主数据库设置了密码,需要在从数据库的配置文件中通过masterauth参数设置主数据库的密码,从而使从数据库连接主数据库的时候自动使用AUTH命令进行密码认证。

  在配置文件中使用rename-command可以对命令进行重命名,比如 rename-command FLUSHALL MY_FLUSHALL,将命令的名称命名为空的话可以禁用这个命令。

  使用telnet可以直接与Redis服务进行通信,如下所示:

    

   info clients命令可以查看Redis的当前连接数,CONFIG GET maxclients可以查询redis允许的最大连接数,。在redis.conf配置文件中配置CONFIG set maxclients 5000来设置最大连接数(默认为10000),也可以启动redis.service服务时加参数--maxclients 100000来设置最大连接数限制。

5、MongoDB

  类似Redis,MongoDB也属于NoSQL,其会将数据保存在内存中,内存不够时,只将热点数据放入内存,其他数据存在磁盘(Redis内存不够时选择指定的 LRU 算法删除数据)。以下MongoDB与Redis的一些对比。

    MongoDB数据类型类似数据库,比如数值(整形和浮点)、字符串、日期,Redis数据类型有字符串、list、set、map。
    类似数据库,在MongoDB中可以为经常查询的字段创建索引以提高搜索性能。
    MongoDB中的增删改查可以添加很多条件,它提供了丰富的查询语法,可以进行复杂的查询操作,包括范围查询、正则表达式、聚合管道等。
    高可用上MongoDB要优于Redis:集群服务的话Redis需要依赖客户端实现分布式读写,MongoDB则相对简单。
    可靠性上MongoDB比Redis要好:类似MySQL,MongoDB采用binlog方式支持持久化,Redis则使用RDB或AOF方式来实现持久化。
    对于大数据量的存储和读取,MongoDB要优于Redis。
    性能的话Redis高于MongoDB,Redis适合TPS很高但数据量不是很大的场景。

posted on 2021-12-07 09:52  整鬼专家  阅读(283)  评论(0编辑  收藏  举报