zoukankan      html  css  js  c++  java
  • Redis 基础

    1 Redis 介绍

    Redis 是一个开源(BSD许可) 的, 内存中的数据结构存储系统, 它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构, 如 字符串(strings) , 散列(hashes) , 列表(lists) , 集合(sets) ,有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。

    Redis 内置了 复制(replication) , LUA脚本(Lua scripting) , LRU驱动事件(LRU eviction) , 事务(transactions) 和不同级别的 磁盘持久化(persistence) , 并通过 Redis哨兵(Sentinel)和自动 分区 
    (Cluster)提供高可用性(high availability)

    Redis 与其他 key - value 缓存产品有以下三个特点:

    1. Redis支持数据的持久化, 可以将内存中的数据保持在磁盘中, 重启的时候可以再次加载进行使用

    2. Redis不仅仅支持简单的key-value类型的数据, 同时还提供list, set, zset, hash等数据结构的存储

    3. Redis支持数据的备份, 即master-slave模式的数据备份。

     Redis 优势: 
    性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 
    丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。 
    原子 – Redis的所有操作都是原子性的, 同时Redis还支持对几个操作全并后的原子性执行。 
    丰富的特性 – Redis还支publish/subscribe, 通知, key 过期等等特性

    2 Redis 安装

    下载redis 地址

    http://download.redis.io/releases/

    2.1 目录规划

    # 软件存放目录
    /data/soft/
    # redis安装目录
    /opt/redis_cluster/redis_{PORT}/{conf,logs,pid}
    # redis数据目录
    /data/redis_cluster/redis_{PORT}/redis_{PORT}.rdb
    

      

    2.2 redis 安装

    Redis安装命令集合

    Redis安装命令集合
    ### 创建下载目录,安装目录和数据目录
    mkdir -p /data/soft
    mkdir -p /data/redis_cluster/redis_6379
    mkdir -p /opt/redis_cluster/redis_6379/{conf,pid,logs}
    ### 下载软件和创建软链接
    cd /data/soft/
    wget http://download.redis.io/releases/redis-3.2.9.tar.gz
    tar zxf redis-3.2.9.tar.gz -C /opt/redis_cluster/
    ln -s /opt/redis_cluster/redis-3.2.9/ /opt/redis_cluster/redis
    软连接作用方便升级 
    
    ###编译安装
    cd /opt/redis_cluster/redis
    make && make install
    
    ###生成配置文件和启动脚本
    cd /opt/redis/utils/
    ./install_server.sh
    
    ###生成配置文件和启动脚本
    cd /opt/redis_cluster/redis/utils/
    ./install_server.sh
    /opt/redis_cluster/redis_6379/conf/redis.conf
    
    /opt/redis_cluster/redis_6379/logs/redis_6379.log
    /data/redis_cluster/redis_6379
    

      

    也可以去配置文件修改

     

    2.3 常用配置文件解释

    ### 以守护进程模式启动
    daemonize yes
    ### 绑定的主机地址
    bind 10.0.0.130
    ### 监听端口
    port 6379
    
    ### pid文件和log文件的存放地址
    pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
    logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
    
    ### 设置数据库的数量,默认数据库为0
    databases 16
    
    ### 指定本地持久化文件的文件名,默认是dump.rdb
    dbfilename redis_6379.rdb
    
    
    ### 本地数据库的目录
    dir /data/redis_cluster/redis_6379
    

      

    修改完记得重启

    然后启动

    redis-cli -h 10.0.0.130 -p 6379
    

      

    在一段时间内只存在于内存中。默认为no 
    appendonly no
    
    指定更新日志文件名,默认appendonly.aof 
    appendfilename appendonly.aof
    
    指定更新日志条件,共有3个可选值: no:表示等操作系统进行数据缓存同步到磁盘(快) always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) everysec:表示每秒同步一次(折衷,默认值) 
    appendfsync everysec
    

      

    3 redis 数据类型和基本操作

    Redis并不是简单的key-value存储,实际上他是一个数据结构服务器,支持不同类型的值

    Redis keys可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个JPEG文件的内容都可以太长的键值不是个好主意,例如1024字节的键值就不是个好主意,不仅因为消耗内存,而且在数据中查找这类键值的计算成本很高。 
    太短的键值通常也不是好主意,如果你要用”u:1000:pwd”来代替”user:1000:password”,这没有什么问题,但后者更易阅读

    3.1 strings 字符串类型

    这是最简单Redis类型。如果你只用这种类型,Redis就像一个可以持久化的memcached服务器(注:memcache的数据仅保存在内存中,服务器重启后,数据将丢失)。 memcache只会存字符串的类型的数据 

    通常用SET command 和 GET command来设置和获取字符串值

    [root@redis-130 conf]# redis-cli -h 10.0.0.130 -p 6379
    10.0.0.130:6379> set mkey 123456
    OK
    10.0.0.130:6379> get mkey
    "123456"
    

      

    INCR 命令将字符串值解析成整型,将其加一,最后将结果保存为新的字符串值,类似的命令有INCRBY, DECR 和 DECRBY。实际上他们在内部就是同一个命令,只是看上去有点儿不同 
    注意 INCR 是将字符串的解析成整形,所以这个字符串必须是数字才可以

    10.0.0.130:6379> set couner 12c
    OK
    10.0.0.130:6379> get couner 
    "12c"
    10.0.0.130:6379> incr couner 
    (error) ERR value is not an integer or out of range
    
    10.0.0.130:6379> set counter 100
    OK
    10.0.0.130:6379> get counter 
    "100"
    10.0.0.130:6379> incr counter 
    (integer) 101
    10.0.0.130:6379> get counter
    "101"
    10.0.0.130:6379> incrby counter 10
    (integer) 111
    10.0.0.130:6379> get counter
    "111"
    

      

    可以一次存储或获取多个key对应的值,使用MSET和MGET命令

    10.0.0.130:6379> mset a 10 b 20 c 30 
    OK
    10.0.0.130:6379> get a
    "10"
    10.0.0.130:6379> mget a b c
    1) "10"
    2) "20"
    3) "30"
    

      

    使用EXISTS命令返回1或0标识给定key的值是否存在,使用DEL命令可以删除key对应的值,DEL命令返回1或0标识值是被删除(值存在)或者没被删除(key对应的值不存在)。 
    1 表示这个key存在 

     
    10.0.0.130:6379> exists couner
    (integer) 1
    10.0.0.130:6379> del couner
    (integer) 1
    10.0.0.130:6379> exists couner
    (integer) 0
    

      

    TYPE命令可以返回key对应的值的存储类型

    10.0.0.130:6379> set mykey abc
    OK
    10.0.0.130:6379> type mykey
    string
    

      

    可以对key设置一个超时时间,当这个时间到达后会被删除 
    默认key 是永不过期 的,设置过期时间   ,例如用做 一些美团优惠券 在限定的使用 就是这个意思

    10.0.0.130:6379> get mykey
    "abc"
    10.0.0.130:6379> ttl mykey
    (integer) -1
    10.0.0.130:6379> expire mykey 10
    (integer) 1
    10.0.0.130:6379> ttl mykey
    (integer) 5
    10.0.0.130:6379> ttl mykey
    (integer) 3
    10.0.0.130:6379> ttl mykey
    (integer) 2
    10.0.0.130:6379> ttl mykey
    (integer) 2
    10.0.0.130:6379> ttl mykey
    (integer) 1
    10.0.0.130:6379> ttl mykey
    (integer) 0
    10.0.0.130:6379> ttl mykey
    (integer) -2
    10.0.0.130:6379> get mykey
    (nil)
    

      

    (integer) -1 表示这个key 永不过期 
    (integer) -2 表示这个key 不存在 
    其他的数字表示这个还剩多少存活时间,默认是秒为单位

    PERSIST命令抹掉超时时间

    10.0.0.130:6379> set mykey abc ex 100
    OK
    10.0.0.130:6379> ttl mykey
    (integer) 90
    10.0.0.130:6379> persist mykey 
    (integer) 1
    10.0.0.130:6379> ttl mykey
    (integer) -1
    

      

    3.2 Lists 列表类型

    LPUSH 命令可向list的左边(头部)添加一个新元素,而RPUSH命令可向list的右边(尾部)添加一个新元素。 
    最后LRANGE 命令可从list中取出一定范围的元素:

    10.0.0.130:6379> rpush mylist a 
    (integer) 1
    10.0.0.130:6379> rpush mylist b
    (integer) 2
    10.0.0.130:6379> lpush mylist first 
    (integer) 3
    # 取出这个key 的所有内容
    10.0.0.130:6379> lrange mylist 0 -1 
    1) "first"
    2) "a"
    3) "b"
    
    # 从第二个到最后一个的内容 默认第一个是0
    10.0.0.130:6379> lrange mylist 1 -1 
    1) "a"
    2) "b"
    10.0.0.130:6379> lrange mylist 2 -1
    1) "b"
    # 跟python的list 类型相似
    
    #一次向list存入多个值
    10.0.0.130:6379> rpush mylist 1 2 3 4 5 "foo"
    (integer) 9
    
    #pop,它从list中删除元素并同时返回删除的值。可以在左边或右边操作
    10.0.0.130:6379> rpop mylist
    "foo"
    10.0.0.130:6379> lpop mylist
    "first"
    

      

    使用LTRIM把list从左边截取指定长度

    10.0.0.130:6379> lrange mylist 0 -1
    1) "a"
    2) "b"
    3) "1"
    4) "2"
    5) "3"
    6) "4"
    7) "5"
    
    10.0.0.130:6379> ltrim mylist 0 2
    OK
    10.0.0.130:6379> lrange mylist 0 -1
    1) "a"
    2) "b"
    3) "1"
    

      

    3.3 hash 类型

    Redis hash 看起来就像一个 “hash” 的样子,由键值对组成 
    HMSET 指令设置 hash 中的多个域,而 HGET 取回单个域。 HMGET 和 HGET 类似,但返回一系列值

    10.0.0.130:6379> hmset user:1000 username  xixi birthyear 1998 verified 1
    OK
    10.0.0.130:6379> hget user:1000 username
    "xixi"
    10.0.0.130:6379> hmget user:1000 username birthyear
    1) "xixi"
    2) "1998"
    10.0.0.130:6379> hgetall user:1000
    1) "username"
    2) "xixi"
    3) "birthyear"
    4) "1998"
    5) "verified"
    6) "1"
    10.0.0.130:6379> hmset user:1000 abc 1
    OK
    10.0.0.130:6379> hgetall user:1000
    1) "username"
    2) "xixi"
    3) "birthyear"
    4) "1998"
    5) "verified"
    6) "1"
    7) "abc"
    8) "1"
    

      

    设置了 redis 的一些描述信息(username, birthyear, verified, abc) 到哈希表的 user:1000

    3.4 sets 无序集合类型

    Redis Set 是 String 的无序排列。 SADD 指令把新的元素添加到 set 中

    10.0.0.130:6379> sadd myset 1 2 3 
    (integer) 3
    10.0.0.130:6379> smembers myset 
    1) "1"
    2) "2"
    3) "3"
    4) "123"
    

      

    和List类型不同的是,Set集合中不允许出现重复的元素

    10.0.0.130:6379> sadd myset 1 4 
    (integer) 1
    10.0.0.130:6379> smembers myset
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    5) "123"
    

      

    Srem用来删除指定的值

    10.0.0.130:6379> srem myset 2 4
    (integer) 2
    10.0.0.130:6379> smembers myset
    1) "1"
    2) "3"
    3) "123"
    

      

    将3从myset移到myset2,从结果可以看出移动成功。

    10.0.0.130:6379> smove myset myset2 3
    (integer) 1
    10.0.0.130:6379> smembers myset2
    1) "3"
    10.0.0.130:6379> smembers myset
    1) "1"
    2) "123"
    

      

    myset和myset2相比,得出两者之间的差异成员

    10.0.0.130:6379> sadd myset 3
    (integer) 1
    10.0.0.130:6379> sdiff myset myset2
    1) "1"
    2) "123"
    10.0.0.130:6379> sdiff myset2 myset
    (empty list or set)
    

      

    计算myset和myset2集合的交集

    10.0.0.130:6379> sinter myset myset2
    1) "3"
    10.0.0.130:6379> sinter myset2 myset
    1) "3"
    

      

    计算myset和myset2集合的并集

    10.0.0.130:6379> sunion myset2 myset
    1) "1"
    2) "3"
    3) "123"
    

      

    3.5 sorted-sets 有序集合

    Sorted-Sets和Sets类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是Sorted-Sets中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然而需要额外指出的是,尽管Sorted-Sets中的成员必须是唯一的,但是分数(score)却是可以重复的。

    #添加一个分数为1的成员
    10.0.0.130:6379> zadd myzset 1 "one"
    (integer) 1
    #添加两个分数分别是2和3的两个成员
    10.0.0.130:6379> zadd myzset 2 "two" 3 "three"
    (integer) 2
    
    #0表示第一个成员,-1表示最后一个成员。 WITHSCORES选项表示返回的结果中包含每个成员及其分数,否则只返回成员
    10.0.0.130:6379> zrange myzset 0 -1 
    1) "one"
    2) "two"
    10.0.0.130:6379> zrange myzset 0 -1 withscores
    1) "one"
    2) "1"
    3) "two"
    4) "2"
    5) "three"
    6) "3"
    #获取myzset键中成员的数量。
    10.0.0.130:6379> zcard myzset 
    (integer) 3
    #删除成员one和two,返回实际删除成员的数量。
    10.0.0.130:6379> zrem myzset one two
    (integer) 2
    #获取成员three的分数。返回值是字符串形式。
    10.0.0.130:6379> zscore myzset three
    "3"
    

      

    推荐网址:http://redisdoc.com/index.html

  • 相关阅读:
    23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、virtual虚函数
    22.C++- 继承与组合,protected访问级别
    LeetCode-391. 完美矩形(使用C语言编译,详解)
    LeetCode-101.对称二叉树
    STM32-对芯片启动读保护,实现加密(详解)
    21.C++- "++"操作符重载、隐式转换之explicit关键字、类的类型转换函数
    20.C++- "&&","||"逻辑重载操作符的缺陷、","逗号重载操作符的分析
    19.C++-(=)赋值操作符、初步编写智能指针
    18.C++-[ ]操作符使用 、函数对象与普通函数区别(详解)
    ECMAScript 6.0基础入门教程
  • 原文地址:https://www.cnblogs.com/keme/p/10232825.html
Copyright © 2011-2022 走看看