• Redis数据库


    本文参考自hjm4702192的博客

    一、安装

    1. 安装软件

    我使用的是archlinux的分支版本,Manjaro Linux,集成了arch方便的包管理,运行如下命令安装(可以使用图形化安装工具):

    pacman -S redis

    安装完成后,文件列表(redis  4.0.11-1)如下:

    /etc/logrotate.d/redis 
    /etc/redis.conf    /数据库配置
    /usr/bin/redis-benchmark/redis性能测试工具
    /usr/bin/redis-check-aof /检查aof日志的工具
    /usr/bin/redis-check-rdb /检查rbdb日志的工具
    /usr/bin/redis-cli   /用于服务器连接
    /usr/bin/redis-sentinel
    /usr/bin/redis-server /用于服务器启动/关闭
    /usr/lib/systemd/system/redis.service
    /usr/lib/sysusers.d/redis.conf
    /usr/lib/tmpfiles.d/redis.conf
    /usr/share/licenses/redis/LICENSE

    2. 个人修改(可省略)

    为了命令简洁,我执行如下命令,把配置文件(/etc/redis.conf)复制到 (/usr/bin/),然后把(/usr/bin/)添加到系统环境变量。

    cp /etc/redis.conf /usr/bin/redis.conf
    vim /etc/profile # 也可以用其他工具打开)
    
    # 添加以下内容:
    
    # Redis Path
    export PATH="$PATH:/usr/bin"

    3. 配置文件

    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同时使用的线程数量

    4. 开启数据库/连接

    reids-server

    # redis-server 
    24672:C 06 Sep 20:40:17.615 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    24672:C 06 Sep 20:40:17.615 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=24672, just started
    24672:C 06 Sep 20:40:17.615 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
    24672:M 06 Sep 20:40:17.617 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                    _._                                                  
               _.-``__ ''-._                                             
          _.-``    `.  `_.  ''-._           Redis 4.0.11 (00000000/0) 64 bit
      .-`` .-```.  ```/    _.,_ ''-._                                   
     (    '      ,       .-`  | `,    )     Running in standalone mode
     |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
     |    `-._   `._    /     _.-'    |     PID: 24672
      `-._    `-._  `-./  _.-'    _.-'                                   
     |`-._`-._    `-.__.-'    _.-'_.-'|                                  
     |    `-._`-._        _.-'_.-'    |           http://redis.io        
      `-._    `-._`-.__.-'_.-'    _.-'                                   
     |`-._`-._    `-.__.-'    _.-'_.-'|                                  
     |    `-._`-._        _.-'_.-'    |                                  
      `-._    `-._`-.__.-'_.-'    _.-'                                   
          `-._    `-.__.-'    _.-'                                       
              `-._        _.-'                                           
                  `-.__.-'                                               
    
    24672:M 06 Sep 20:40:17.618 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
    24672:M 06 Sep 20:40:17.618 # Server initialized
    24672:M 06 Sep 20:40:17.618 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
    24672:M 06 Sep 20:40:17.618 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
    24672:M 06 Sep 20:40:17.618 * DB loaded from disk: 0.000 seconds
    24672:M 06 Sep 20:40:17.618 * Ready to accept connections
    

    redis-cli  #没有设置密码,直接连接

    # root @ geoffrey-pc in /home/geoffrey [17:33:43] 
    $ redis-cli 
    127.0.0.1:6379> 
    

    二、优缺点

    1. 优点

    使用redis,主要是从两个角度去考虑:性能并发、以及分布锁

    (一)性能
    我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。

    (二)并发

    在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问数据库。

    2. 缺点

    (一)缓存和数据库双写一致性问题

    (二)缓存雪崩问题

    (三)缓存击穿问题

    (四)缓存的并发竞争问题

    三、数据类型

    --- 参考自徐刘根的博客

    几个基本的命令:
    KEYS *                       获得当前数据库的所有键
    EXISTS key [key ...]  判断键是否存在,返回个数,如果key有一样的也是叠加数
    DEL key [key ...]       删除键,返回删除的个数
    TYPE key                  获取减值的数据类型(string,hash,list,set,zset)
    FLUSHALL                清空所有数据库

    è¿éåå¾çæè¿°

    1. String


    这个其实没啥好说的,最常规的set/get操作,value可以是String也可以是数字。一般做一些复杂的计数功能的缓存。

    (1)常用命令如下:

    这里写图片描述

    EXPIRE   设置或者更新到期时间,到期后自动清除,单位 设置为-1表示永不过期。

    set key value [ex seconds] [px milliseconds] [nx|xx] 

    其中,·ex seconds: 为键设置级过期时间。
               ·px milliseconds: 为键设置毫秒级过期时间。
               ·nx: 键必须不存在, 才可以设置成功, 否则不修改,用于添加
               ·xx: 与nx相反, 键必须存在, 才可以设置成功, 用于更新

    (2)Redis中的自增命令和自减命令:(原子增量,多个客户端请求不会冲突)

    这里写图片描述

    (3)  除了get、set、del、自增、自减等操作外,Redis还提供了下面一些操作:

    1、获取字符串长度         strlen key
    2、往字符串append内容 
    3、设置和获取字符串的某一段内容 
    4、设置及获取字符串的某一位(bit) 
    5、批量设置一系列字符串的内容

    如下图所示:

    这里写图片描述

    (4)应用场景:

    String是最常用的一种数据类型,普通的key/value存储都可以归为此类,value其实不仅是String, 也可以是数字:比如想知道什么时候封锁一个IP地址(访问超过几次)。INCRBY命令让这些变得很容易,通过原子递增保持计数。

    (二)hash


    这里value存放的是结构化的对象,比较方便的就是操作其中的某个字段。博主在做单点登录的时候,就是用这种数据结构存储用户信息,以cookieid作为key,设置30分钟为缓存过期时间,能很好的模拟出类似session的效果。

    (1)常用命令如下:

    这里写图片描述

    (2)其他命令包含添加和删除键值对的命令、获取所有键值对的命令、以及对键值对的值进行自增和自减操作的命令,如下所示:

    这里写图片描述

    (三)list


    使用List的数据结构,可以做简单的消息队列的功能。另外还有一个就是,可以利用lrange命令,做基于redis的分页功能,性能极佳,用户体验好。本人还用一个场景,很合适---取行情信息。就也是个生产者和消费者的场景。LIST可以很好的完成排队,先进先出的原则。

    (1)常用命令如下:

    这里写图片描述

    LPUSH和RPUSH命令分别用于将元素推入列表的左端和右端;LPOP和RPOP命令分别用于从列表的左端和右端弹出元素,也就是删除元素;

    其中对于LRANGE命令来说,使用0位范围的起始索引,-1为范围的结束索引,可以取出列表包含元素的所有元素。

    (2)除了上边比较常用的命令之外,Redis列表还可以从列表里边移除元素、将元素插入列表中间、将列表修剪至指定长度的命令,以及一些其他命令。

    (3)使用场景:

    • 微博 TimeLine
    • 消息队列

    (四)set


    因为set堆放的是一堆不重复值的集合。所以可以做全局去重的功能。为什么不用JVM自带的Set进行去重?因为我们的系统一般都是集群部署,使用JVM自带的Set,比较麻烦,难道为了一个做一个全局去重,再起一个公共服务,太麻烦了。


    另外,就是利用交集、并集、差集等操作,可以计算共同喜好,全部的喜好,自己独有的喜好等功能。

    (1)常用命令如下:

    这里写图片描述

    SADD name value1 vlaue2 ...

    (2)除了常见的命令之外,还有交集、并集、差集的计算,如下:

    这里写图片描述

    表中有错误,STOP改为SPOP  

    SRANDMENBER - 随机获取集合中的一个元素,并且不会删除列表中的该元素。

    (3)使用场景:

    • 共同好友、二度好友
    • 利用唯一性,可以统计访问网站的所有独立 IP
    • 好友推荐的时候,根据 tag 求交集,大于某个 threshold 就可以推荐

    (五)sorted set


    sorted set多了一个权重参数score,集合中的元素能够按score进行排列。可以做排行榜应用,取TOP N操作。

    有序集合和散列一样,用于存储键值对;有序集合的键被称为成员member,每一个成员都是独一无二的;而有序集合的值被称为分值score,分值必须是浮点数。

    有序集合是Redis里面唯一一个既可以根据成员访问元素,又可以根据分值以及分值的排序来访问元素的结构。

  • 相关阅读:
    mongodb 的安装历程
    从C的声明符到Objective-C的Blocks语法
    #译# Core Data概述 (转)
    避免在block中循环引用(Retain Cycle in Block)
    GCD和信号量
    Blocks的申明调用与Queue当做锁的用法
    [译]在IB中实现自动布局
    清理Xcode的技巧和方法
    SVN的Status字段含义
    iOS应用崩溃日志揭秘2
  • 原文地址:https://www.cnblogs.com/geoffreyone/p/9899748.html
Copyright © 2020-2023  润新知