zoukankan      html  css  js  c++  java
  • redis介绍和安装(一)

    Redis介绍
    redis是一个key-value存储系统。

    和Memcached类似,它支持存储的value类型相对更多,包括

    string(字符串)、 list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。

    数据都是缓存在内存中。

    可以在一些官网和网站上了解下。

    redis.io     www.redis.cn
    www.redis.io/documentation
    redis作者谈redis应用场景
    http://blog.nosqlfan.com/html/2235.html
    redis bitmap进行活跃用户统计
    http://blog.nosqlfan.com/html/3501.html
    nosqlfan.com

    redis和memcached区别:

    区别的是redis会周期性的 把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

    redi和mysql的一些区别:

    redis和mysql要根据具体业务场景去选型
    
    mysql:数据放在磁盘   redis:数据放在内存
    redis适合放一些频繁使用,比较热的数据,因为是放在内存中,读写速度都非常快
     
    首先要知道mysql存储在磁盘里,redis存储在内存里,redis既可以用来做持久存储,也可以做缓存,而目前大多数公司的存储都是mysql + redis,其中:
    mysql作为主存储,redis作为辅助存储被用作缓存,加快访问读取的速度,提高性能。
     
    那么为什么不直接全部用redis存储呢?
    因为redis存储在内存中,如果存储在内存中,存储容量肯定要比磁盘少很多,那么要存储大量数据,只能花更多的钱去购买内存,造成在一些不需要高性能的地方是相对比较浪费的,所以目前基本都是mysql(主) + redis(辅),在需要性能的地方使用redis,在不需要高性能的地方使用mysql,好钢用在刀刃上
    1)mysql支持sql查询,可以实现一些关联的查询以及统计;
    2)redis对内存要求比较高,在有限的条件下不能把所有数据都放在redis;
    3)mysql偏向于存数据,redis偏向于快速取数据,但redis查询复杂的表关系时不如mysql,所以可以把热门的数据放redis,mysql存基本数据
     

    redis 应用场景

    1 内存服务
    2作为mamcache的替代品
    3数据一致性有一定要求
    4当要支持更多数据类型,使用redis更合适
    5需要提供主从

    redis和memcached相比独特之处

    1 redis可以用来存储,memcached用来做缓存
    2 mecached存储的数据是字符串,redis:字符串,链表,哈希结构,集合,有序集合

    redis持久化缓存服务
    周期性把更新的数据写入到磁盘,把修改的操作记录追加到文件记录下来
    redis缺陷

    内存低于物理内存3/5
    两种方式实现数据持久化:
    1,使用快照方式,将内存中的数据不断写入磁盘
    2,使用类似mysql的binlog日志(aof)方式,记录每次更新的日志。
    
    建议:
    更新频繁,一致性要求比较高,AOF    策略为主
    更新不频繁,可以容忍少量数据丢失或者错误,snapshot策略为主。

    redis优化经验总结:

    1  根据业务需要选择合适的数据类型,并为不同的应用场景设置相应的紧凑存储参数
    2  当业务场景不需要数据持久化时,关闭所有的持久化方式可以获得最佳的性能以及最大内存的使用量
    3  如果需要持久化,根据是否可以容忍重启丢失部分数据在快照方式和语句追加方式之间选择其一,不要使用虚拟内存以及
       diskstore方式,每秒,实时写入AOF。
    4  不要让你的redis所在机器物理内存使用超过实际内存的3/5
    5  redis.conf 中的maxmemory选项,该选项是告诉redis当使用了多少物理内存后开始拒绝后续的写入要求,该参数能很好
       保护好你的redis不会因为使用了过多的物理内存而导致swap,最终严重影响性能甚至崩溃。redis.conf文件中vm-enabled
       为no
    6  大数据尽量按业务使用多个redis实例把数据分散开。
    通过rdb,aof文件进行备份。

    下面记录下redis服务安装过程

    安装依赖软件
    # yum install gcc-c++ tcl
    
    redis下载安装,稳定版本,下载解压
    wget http://download.redis.io/releases/redis-4.0.9.tar.gz
    tar xf redis-4.0.9.tar.gz
    cd redis-4.0.9
    less README.md
    yum -y install tree telnet
    
    编译安装
    make    (如果是32位make 32bit) 
    make PREFIX=/usr/local/redis install (定义安装路径)
    
    tcl要大于8.4
    cd /usr/local/src/bin/
    ls
    redis-benchmark     redis性能测试工具,测试redis在你的系统和配置下读写性能
    redis-check-aof        检查aof日志的工具,类似检查mysql binlog工具
    redis-check-dump    检查rbd日志工具,本地数据库rdb文件检查。
    redis-cli            连接用的客户端,命令行操作工具。
    redis-server        redis服务进程
                
    配置环境变量
    echo 'PATH=/usr/local/redis/bin/:$PATH' >>/etc/profile
    tail -1 /etc/profile
    which redis-server
    redis-server -h
    
    mkdir /usr/local/redis/conf        (一般都新建conf,也可以不建,这样标准些)
    cp /usr/local/src/redis-2.6.16/redis.conf /usr/local/redis/conf/
                
    redis-server /usr/local/redis/conf/redis.conf &    (后台启动)
    lsof -i :6379
    安装后发现出现一行WARNING    
    添加命令: sysctl vm.overcommit_memory=1(防止内存不够,丢失数据)
    vm.overcommit_memory=1
    vi /etc/sysctl.conf
    vm.overcommit_memory = 1
    sysctl -p

    vm.overcommit_memory参数说明
    根据内核文档,该参数有三个值,分别是:
    0:当用户空间请求更多的内存时,内存尝试估算出剩余可用的内存
    1:当设置参数为1,内核允许超量使用内存直至用完为止,主要用于科学技算
    2:内核会使用一个决不过量使用内存的算法,即系统整个内存空间不能超过
        swap+50%的RAM值,50%的参数设定在overcommit_ratio中设定

    redis关闭
    redis-lis shutdown save

    redis-cli
    127.0.0.1:6379>
    让redis以后台进程形式运行
    vi redis.conf
    daemonize yes            
    ./bin/redis-server ./redis.conf                
    和mysql有些一样,在命令行显示
    redis-cli -h 192.168.133.4 -p 6379 set site ww.baidu.com
    redis-cli -h 192.168.133.4 -p 6379 get site


    用telnet登录
    telnet 192.168.133.4 6379
    >help set
    >help @string
    >help 后面可以加上Tab键,

    ***************************************************************
    ***************************************************************
    redis安装:为客户端设置外部连接密码

    设定密码
    requirepass test001(这个为密码)
    redis-server /usr/local/redis/conf/redis.conf &

    登录
    redis-cli
    set k1 v1
    (error)NOAUTH Authentication required
    >auth test001

    >set k1 v1
    >get k1

    登录方法二
    redis-cli -a passwd
    每次登录的时候都要添加密码,这是采取的安全措施。


    设置命令别名,禁用危险的命令。
    在配置文件中,SECURITY中查找。
    在配置文件中
    grep '^rename' /usr/local/redis/conf/redis.conf
    rename-command get oldboy
    将get的命令设置为oldboy,重启服务,使用get不能识别,
    使用oldboy能够识别。

    在生产环境中一般的配置会添加端口号,密码。
    *******************************************************
    ********************************************************
    关于redis报错的问题

    第一个警告:

    The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128
    意思是:TCP  backlog设置值,511没有成功,因为 /proc/sys/net/core/somaxconn这个设置的是更小的128

    临时解决方法:(即下次启动还需要修改此值)
    echo 511 > /proc/sys/net/core/somaxconn
    永久解决方法:(即以后启动还需要修改此值)
    将其写入/etc/rc.local文件中。
    baklog参数实际控制的是已经3次握手成功的还在accept queue的大小。


    第二个警告:

    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.
    overcommit_memory参数设置为0!在内存不足的情况下,后台程序save可能失败。建议在文件 /etc/sysctl.conf 中将overcommit_memory修改为1

    临时解决方法:echo "vm.overcommit_memory=1" > /etc/sysctl.conf
    永久解决方法:将其写入/etc/sysctl.conf文件中。

    第三个警告

    you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix thisissue 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 thesetting after a reboot. Redis must be restarted after THP is disabled.
    你使用的是透明大页,可能导致redis延迟和内存使用问题。执行 echo never > /sys/kernel/mm/transparent_hugepage/enabled 修复该问题.

    临时解决方法:
    echo never > /sys/kernel/mm/transparent_hugepage/enabled。
    永久解决方法:
    将其写入/etc/rc.local文件中。

    安装make的时候报错

     如果编译安装过程中,出现报错:

    zmalloc.h:51:31: error: jemalloc/jemalloc.h: No such file or directory

    原因:一些编译依赖或原来编译遗留出现的问题
    解决方案:make distclean。清理一下,然后再make。
    **********************************************            
    通用操作

    查询有哪些key
    *:通配任意字符
    ?:通配单个字符
    []:通配括号内的某一个字符

    set site www.zixue.it
    set age 26
    keys *
    keys site
    keys s*
    keys site*
    keys sit[ey]            
                
    随机出现key
    randomkey
    
    type site
    返回key存储的值的类型
    
    key值是否存在
    exists age
    exists site
    存在返回1,不存在返回0
    
    删除key
    key *
    del age
    exists age
    
    改名
    rename site syp
    exists site
    
    set site www.zixue.it
    set search www.so.com
    rename site search 
    改名到新名,如果重名,则覆盖。使用renamenx
    renamenx site search 
    如果search 存在,则不改,如果不存在,则改正
    返回值为0,则没改成功,返回为1,则更改成功
    
    在配置文件中默认有16(0-15)个数据库,默认是写在0数据库上
    move sea 1
    keys *
    select 1
    keys *
    
    设定有效期
    ttl search 查询生命周期   
    对于不存在的key或者已过期的key,都返回-1
    redis2.8中,对于不存在的key返回值-2
    
    expire search 10
    pexpire key :毫秒数,设置生命周期
    pttl key:以毫秒返回生命周期
    
    set site www.zixue.it
    expore site 10
    ttl site
    persist site
    get site

    redis 数据结构操作

    字符串类型
    set key value [ex 秒数]|[px 毫秒数] [nx]/[xx]
    
    flushdb 清空
    keys *
    
    set search www.baidu.com ex 10 
    10秒有效
    ttl search
    ex和px同时写,以后面的有效期为准。
    set search www.baidu.com ex 10 px 1205,实际有效期是1205
    nx:表示key不存在时,执行操作
    xx:表示key存在时,执行操作
    
    flushdb
    set site www.so.com
    set site www.baidu.com nx
    get site
    set site www.google.com xx
    get site
    set abc www.google.com xx
    
    mset 一次性设置多个键值
    mget 获得
    
    setrange key offset value
    把字符串的offset偏移字节,改成value
    如果偏移量>字符长度,该字符自动补0x00
    set world hello
    get world
    setrange world 2 ??
    get word
    
    setrange world 9 ??
    get world
    
    append key value:把value追加到key的原值上
    
    getrange key start stop
    获取字符串中[start,stop]范围的值
    对于字符串的下标,左数从0开始,右数从-1开始
    set title 'chinese'
    getrange title 0 3
    getrange title 1 -2
    
    start>=length,返回空字符串
    stop>=length,则截取至字符结尾
    如果start所处的位置在stop右边,返回空字符串
    
    set status sleep
    getset status wakeup
    get status
    getset status working
    
    适合场景,
    秒杀,比如说抢小米手机,问还有多少手机,每个人都在抢。
    不用读取mysql数据库,只需要读取redis,进行预订,预订好了,下单给mysql数据库
    set age 29
    incr age
    decr age
    incrby age 5
    decrby age 5
    incrbyfloat age 0.5
    
    setbit key offset value 设置offset对应的二进制位上的值
    
    set char A
    set char 2 1
    set char 2 0
    offset最大2^32-1,最大字符串512
    
    bitop operation destkey key1 key2
    对key1,key2,keyN作operation,并将结果保存到destkey上
    operation可以是and,or,not,xor
    setbit lower 7 0
    setbit lower 2 1
    get lower
    set char Q
    get char
    bitop or char char lower
    get char
    
    对于not操作,key不能多个

    综上所述:

    redis安装脚本和其配置文件
    #!/bin/bash
    ### 需要gcc gcc-c++  配置文件 启动脚本查看最下面###
    yum install gcc-c++ tcl
    #下载最新redis版本 cd
    /usr/local/src/ wget http://download.redis.io/releases/redis-3.2.6.tar.gz tar zxvf redis-3.2.6.tar.gz cd redis-3.2.6 make make install mkdir /etc/redis mkdir /var/log/redis -p mkdir /opt/redis -p ## 拷贝默认配置文件,并根据指定端口进行修改 ## 以端口6380举例 #注意端口号(这里不使用默认端口) cp redis.conf /etc/redis/6380.conf #修改为守护进程 sed -i 's/daemonize no/daemonize yes/g' /etc/redis/6380.conf #修改默认端口 sed -i 's/port 6370/port 6380/g' /etc/redis/6380.conf #指定log路径 sed -i 's#logfile ""#logfile "/var/log/redis/redis_6380.log"#g' /etc/redis/6380.conf #修改本地数据库名称,可能要开多个redis sed -i 's/dbfilename dump.rdb/dbfilename dump_6380.rdb/g' /etc/redis/6380.conf #修改本地数据库存放路径 sed -i 's#dir ./#dir /opt/redis#g' /etc/redis/6380.conf #添加redis密码 sed -i 's/# requirepass foobared/requirepass 设定的密码/g' /etc/redis/6389.conf #开启持久化 sed -i 's/appendonly no/appendonly yes/g' /etc/redis/6380.conf #修改日志名称 sed -i 's/appendfilename "appendonly.aof"/appendfilename "appendonly_6380.aof"/g' /etc/redis/6380.conf #修改pid文件名称 sed -i 's#pidfile /var/run/redis_6370.pid#pidfile /var/run/redis_6380.pid#g' /etc/redis/6380.conf ## 命名规则为"redis端口号",例如"redis6380" cat >> /etc/init.d/redis6380 << EOF #!/bin/sh #chkconfig: 2345 58 68 # # Simple Redis init.d script conceived to work on Linux systems # as it does use of the /proc filesystem. REDISPORT=6380 EXEC=/usr/local/bin/redis-server CLIEXEC=/usr/local/bin/redis-cli PIDFILE=/var/run/redis_${REDISPORT}.pid CONF="/etc/redis/${REDISPORT}.conf" AUTH_PASSWORD="你的密码" case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed" else echo "Starting Redis server..." $EXEC $CONF fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running" else PID=$(cat $PIDFILE) echo "Stopping ..." $CLIEXEC -p $REDISPORT -a $AUTH_PASSWORD shutdown while [ -x /proc/${PID} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;; *) echo "Please use start or stop as first argument" ;; esac EOF # 配置redis配置 cat >> /etc/redis/6380.conf << EOF bind 127.0.0.1 protected-mode yes port 6380 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize yes supervised no pidfile /var/run/redis_6380.pid loglevel notice logfile "/var/log/redis/redis_6380.log" databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump_6380.rdb dir /opt/redis slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no slave-priority 100 requirepass 设定的密码 appendonly yes appendfilename "appendonly_6380.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes EOF #启动脚本需要添加密码,chkconfig,可以参考最下方 cp utils/redis_init_script /etc/init.d/redis6389 /etc/init.d/redis6380 start      
  • 相关阅读:
    python 面向对象专题(20):基础(11)多态/封装
    python 面向对象专题(19):基础(10)-继承
    python 面向对象专题(18):基础(9)面向对象应用
    python 面向对象专题(17):基础(8)面向对象基础
    机器学习sklearn(92):算法实例(49)分类(30)XGBoost(六)XGBoost应用中的其他问题
    机器学习sklearn(91):算法实例(48)分类(27)XGBoost(五)XGBoost的智慧(二)参数alpha,lambda
    基于小熊派Hi3861鸿蒙开发的IoT物联网学习【四】
    基于小熊派Hi3861鸿蒙开发的IoT物联网学习【三】
    基于小熊派Hi3861鸿蒙开发的IoT物联网学习【二】
    C语言学习之基本数据类型【一】
  • 原文地址:https://www.cnblogs.com/fengzhongzhuzu/p/8780024.html
Copyright © 2011-2022 走看看