zoukankan      html  css  js  c++  java
  • Redis安装

    1、概况

      redis是NoSql的一种,NoSql即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的列表类型键可以用来实现队列,支持阻塞式读取,所以可以很容易的实现一个高性能的优先级队列。

    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)。

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

        ④、整数回复,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不存在则创建。

             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的命令都是原子操作,但是在业务中或者使用多个命令的时候就要注意是否会出现竞态条件。比如我们先GET了个foo键的值,然后判断它为true的话执行A,为false的话执行B,很有可能在我们GET完后foo的值就被其它客户端改变了。再比如说我们自己实现INCR命令的话,先使用GET命令获得值为5,然后将值+1,即再通过SET命令将键值设为6,但如果是两个客户端同时使用GET获得值为5的话,那么本来最后的值应该为7,可实际上为6。这种竞态条件可以通过事务和脚本来实现自定义的原子操作。

  • 相关阅读:
    转载 linux 僵尸进程,讲的很透彻
    linux 程序自动运行总结
    使用__FILE__和__LINE__定位错误
    CURL简单使用
    阿里云域名绑定IP
    使用PHPEXCEL导入数据到数据库
    关于使用ueditor时候遇到的情况
    TP5使用PHPMAILER发送邮件
    使用ajax,结合jquery,php实现图片上传预览功能
    mysql关于数据量大的时候分页分批处理
  • 原文地址:https://www.cnblogs.com/milanleon/p/15629912.html
Copyright © 2011-2022 走看看