• Redis学习笔记


    安转与运行

    Windows下安装运行

    安装:下载redis的Windows版本,解压到目标安装目录
    启动服务端:在cmd窗口,切换到redis安装目录下,运行如下命令:
    redis-server.exe redis.conf
    redis.conf是redis的配置文件。
    启动客户端:服务端不要关闭,再打开新的cmd窗口,切换到redis安装目录下,运行如下命令:
    redis-cli.exe -h 127.0.0.1 -p 6379

    Linux下安装运行

    安装:在Linux控制台输入如下命令:
    $wget http://download.redis.io/release/redis-2.8.17.tar.gz
    $tar xzf redis-2.8.17.tar.gz
    $cd redis-2.8.17
    $make
    make完后,redis-2.8.17目录下会出现编译后的redis服务程序redis-server,用于测试的客户端redis-cli,两个程序位于安装目录src目录下
    启动服务端:
    $cd src
    $./redis-server redis.conf
    启动客户端:
    $cd src
    $./redis-cli -h 127.0.0.1 -p 6379

    配置项说明

    配置文件:redis.conf

    1.启用守护线程运行redis,默认是no,启用采用yes
    配置项:daemonize no

    2.配置pid(Process ID)写入文件位置(当redis以守护进程方式运行时,redis默认把pid写入下面的文件)
    配置项:pidfile /var/run/redis.pid

    3.指定redis监听端口
    配置项:port 6379

    4.绑定主机地址
    配置项:bind 127.0.0.1

    5.设置客户端闲置超长时间(秒),0表示关闭该功能
    配置项:timeout 300

    6.指定日志记录级别,支持四个级别:debug,verbose,notice,warning,默认verbose
    配置项:loglevel verbose
    注:
    degug: 非常多的信息,用于调试测试
    verbose:非常多的信息,但不想debug那么乱
    notice: 轻量级的verbose
    warning: 只有非常重要的信息

    7.日志记录方式,默认为标准输出
    配置项:logfile stdout
    注:如果redis为守护进程方式运行,日志记录方式为标准输出,则日志将会发送给dev/null

    8.设置数据库的数量,默认设置16个,可以使用 SELECT <dbid> 命令在连接上指定数据库id
    配置项:databases 16

    9.配置数据同步到数据文件的条件,可以设置多条配合
    配置格式:save <seconds> <changes> 意义:在多少秒内有多少次更新操作
    默认配置:
    save 900 1
    save 300 10
    save 60 10000

    10.配置存储数据至本地数据库是是否采用LZF压缩字符创对象,默认yes。
    配置项:rdbcompression yes
    注:如果关闭,则会节省CPU时间,但会造成数据库文件变大,基本上都是设置为yes。

    11.配置本地数据库文件名
    配置项:dbfilename dump.rdb

    12.配置工作目录,本地数据库会存放到该目录
    dir ./

    13.设置master服务的IP和端口,在设置本机redis为slave,slave会自动从master同步数据
    配置项:slaveof <masterip> <masterport>

    14.设置slave连接master服务的密码(当本机redis为slave,master服务设置密码时)
    配置项:masterauth <master-password>

    15.设置redis连接密码
    配置项:requirepass <password>
    注:如果设置了连接密码,客户端在连接redis时需要通过 AUTH <password> 命令提供密码

    16.设置同一时间最大客户端连接数,默认无限制,设置为0也表示不作限制
    配置项:maxclients 0
    注:redis可以同时打开的客户端连接数为redis进程可以打开的最大文件描述符数。当客户端连接数达到限制时,redis会关闭新的连接并向客户端发返回错误信息:max number of clients reached

    17.设置redis最大内存限制
    配置项:maxmemory <bytes>
    注:当使用redis为状态服务器或缓存时,而不是真数据库时,设置最大内存是好建议。当达到最大内存时,redis会尝试去删除即将超时的key,或保存更长时间的key,或从闲置列表删除对象,写操作时会得到错误信息,可能导致DB不稳定。

    18.设置最大内存达到是,删除策略,默认volatile-lru
    配置项:maxmemory-policy volatile-lru
    注:支持五种策略:
    volatile-lru -> remove the key with an expire set using an LRU algorithm
    allkeys-lru -> remove any key accordingly to the LRU algorithm
    volatile-random -> remove a random key with an expire set
    allkeys->random -> remove a random key, any key
    volatile-ttl -> remove the key with the nearest expire time (minor TTL)
    noeviction -> don't expire at all, just return an error on write operations

    19.设置是否在每次更新操作后进行日志记录
    配置项:appendonly no
    redis在默认情况下,是异步的把数据写入磁盘,如果不开启,可能在断电时导致一段时间内的数据丢失,因为redis同步数据是跟据save条件执行的。

    20.设置更新日志文件名,默认为appendonly.aof
    配置项:appendfilename appendonly.aof

    21.设置更新日志策略
    配置项:appendfsync everysec
    注:可选项:
    no:当操作系统进行数据缓存时同步到磁盘,运行快,不安全
    always:每次更新操作后都同步数据到磁盘,运行慢,安全
    everysec:美标同步一次(no与always的折中)

    22.设置是否启用虚拟内存机制,默认no
    配置项:vm-enabled no

    23.虚拟内存文件路径,不可多个redis实例共享
    vm-swap-file /tmp/redis.swap

    24.设置虚拟最大内存
    配置项:vm-max-memory 0
    注:将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memeory设置多小,所有的索引数据(keys)都是内存存储的,当vm-max-memory设置为0时,所有的value都是存在与磁盘的。

    25.设置redis的swap分成的page的单个page页大小(bytes)
    配置项:vm-page-size 32
    注:redis swap文件分成了很多的page,一个对象可以保存在多个page上,但是一个page不能被多个对象共享,vm-page-size的大小需要根据存储的数据大小设定的,作者建议如果存储很多小对象,page大小最好设置为32bytes或64bytes。如果不确定,就是用默认值

    26.设置swap文件中的page数量
    配置项:vm-pages 134217728
    注:页表是存储在内存中的,在磁盘上每8个page将消耗1byte内存

    27.设置访问swap文件的线程数
    配置项:vm-max-threads 4
    注:线程数最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。

    28.设置在向客户端应答时,是否吧较小的包合并为一个包发送,默认yes
    配置项:glueoutputbuf yes

    29.设置在超过一定的数量或最大的元素超过某一临界值时,采用一种特殊的哈希算法
    配置项:
    设置数量:hash-max-zipmap-entries 64
    设置大小:hash-map-zipmap-value 512

    30.设置是否激活重置哈希,默认yes
    配置项:activerehashing yes

    31.设置包含其他的配置文件
    配置项:include /path/to/local.conf
    注:可以在同一主机上多个redis实例之间使用同一个配置文件,同时各个实例又拥有自己特定的配置文件。

    关于Key的常用命令

     

    1.del key
    //描述:删除key。
    //返回值:
    // "1":删除成功
    // "0":删除失败

     

    2.dump key
    //描述:序列化给定的key对应的value,并返回被序列化后的值。
    //返回值:如果key不存在,返回nil,否则返回被序列化后的值。

     

    3.exists key
    //描述:判断是否存在key。
    //返回值:key存在则返回1,否则返回0。

     

    4.expire key seconds
    //描述:为key设置过期时间(s),key过期后将不再可用
    //返回值:成功返回1,否则返回0。

     

    5.expireat key timestamp
    //以UNIX时间戳格式设置key的过期时间,key过期后将不再可用
    //返回值:成功返回1,否则返回0。

     

    6.pexpire key milliseconds
    //描述:设置key的过期时间以毫秒记
    //返回值:成功返回1,否则返回0。

     

    7.pexpireat key milliseconds-timestamp
    //描述:设置key过期时间的时间戳以毫秒记
    //返回值:成功返回1,否则返回0。

     

    8.keys pattern
    //描述:查找所有符合给定模式的key
    //返回:key的list

     

    9.select database
    //描述:切换数据库
    //返回:成功返回OK,否则返回错误信息。

     

    10.move key destination_database
    //描述:将当前数据库的key移动到给定的数据库db中
    //返回:成功返回1,否则返回0。如果key不存在则失败,如果目标数据库同样存在key也会失败。

     

    11.persist key
    //描述:用于移除给定key的过期时间,使key永不过期。
    //返回值:成功返回1,否则返回0。

     

    12.ttl key
    //描述:返回给定key的剩余生存时间(s)
    //返回值:当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。

     

    13.pttl key
    //描述:返回给定key的剩余生存时间(ms)
    //返回值:当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。

     

    14.randomkey
    //描述:从当前数据库中随机返回一个key
    //返回值:当数据库不为空时,返回一个 key 。 当数据库为空时,返回 nil 。

     

    15.rename oldkey newkey
    //描述:修改key的名称
    //返回:改名成功提示OK,失败返回一个错误,当oldkey和newkey相同,或oldkey不存在时,返回一个错误,当oldkey和newkey都存在时,newkey的值将被oldkey的值覆盖。

     

    16.renamenx oldkey newkey
    //描述:当newkey不存在时,将oldkey重命名为newkey
    //返回值:成功返回1,否则newkey存在时返回0,oldkey不存在时返回一个错误信息

     

    17.type key
    //描述:返回 key 存储的值的数据类型
    //返回值:数据类型有:
    none (key不存在)
    string (字符串)
    list (列表)
    set (集合)
    zset (有序集)
    hash (哈希表)

    字符串相关的命令

    1.SET key value
    //设置指定key的值,如果key已存在,旧的value将被覆盖
    //返回值:成功返回OK,失败返回错误信息

    2.get key
    //获取key对应的value,不存在则返回nil,如果key不是字符串类型,则提示错误信息
    //返回值:key存在返回key的值,不存在返回nil

    3.getrange key startindex endindex
    //获取key的value的子字符串(包括index所在位置的字符),index为负数时,则是从右边定位的位置
    //返回值:只有当key存在,且endindex大于startindex,且startindex在value范围内,返回值为相应的值,否则返回空串

    4.getset key value
    //将key的值设置为value,并返回key的旧值
    //返回值:如果key不存在,则设置key值为value,返回nil,当key存在但不是字符串类型是,返回一个错误

    5.getbit key offset
    //对key所存储的字符串值,获取指定偏移量上的位
    //返回值:如果当偏移量 OFFSET 比字符串值的长度大,或者 key 不存在时,返回 0 ,否则返回真实值。

    6.mget key[key1...]
    //获取多个key的值
    //返回值:返回一个list,如果某个key不存在或者不是String,对应返回nil

    7.setbit key offset value
    //对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
    //返回值:成功返回1,否则返回0。对key所存储的字符串值,如果offset超出value的范围,返回0表示设置失败,但是事实已经成功了,且字符串边长,这可能是个bug,也可能我的版本比较旧。

    8.setex key seconds value
    //将value关联到key,并将key的过期时间设置为seconds(s)。如果key已经存在,旧值将被覆盖
    //成功返回ok

    9.setnx key value
    //只有在key不存在时,设置key的值
    //返回值:成功返回1,失败返回0。如果key已经存在,执行失败。

    10.setrange key offset value
    //用value参数复写给定key所存储的字符串的值,从偏移量offset开始
    //返回值:被修改后的字符串长度,offset为非负整数,且offset可以超出value的长度。若key不存在则会被创建,offset之前的字符为x00。如果offset为负则返回错误信息。

    11.strlen key
    //返回key所存储的字符串的长度,如果key存储的不是字符串你时,返回一个错误。
    //返回值:字符串的长度,key不存在则返回0。

    12.mset key value [(key value )...]
    //同时设置一个或多个key-value对
    //返回值:总是返回OK。

    13.msetnx key value [(key value)...]
    //同时设置一个或多个key-value对,当且仅当所有给定key都不存在。
    //返回值:当所有key都成功设置,返回1。如果有哪个key存在,则执行失败,全部不生效。

    14.psetex key milliseconds value
    //与命令setnx命令相似,但以毫秒为单位设置key的过期时间

    15.incr key
    //将key中储存的数字值增一,如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。本操作的值限制在 64 位(bit)有符号数字表示之内。key的value必须是证书。
    //返回值:执行incr之后key的值

    16.incrby key increment
    //将key所储存的值加上给定的增量值,如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。本操作的值限制在 64 位(bit)有符号数字表示之内。key的value值和increment必须是整数。
    //返回值:执行incrby之后的key的值

    17.incrbyfloat key increment
    //将key所储存的值加上给定的浮点增量值,如果 key 不存在,那么 INCRBYFLOAT 会先将 key 的值设为 0 ,再执行加法操作。
    //可用版本:>=2.6.0
    //返回值:执行命令之后key的值。

    18.decr key
    //将key中储存的值减一。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。本操作的值限制在 64 位(bit)有符号数字表示之内。key的value值必须是整数。
    //返回值:执行命令之后key的值

    19.decrby key decrement
    //key所储存的值减去给定的减量值。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECRBY 操作。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。本操作的值限制在 64 位(bit)有符号数字表示之内。key的value值和decrement必须是整数。
    //返回值:执行命令之后key的值

    20.append key value
    //如果key存在并且是一个字符串,则将value追加到key原来值的末尾。如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。
    //返回值:返回执行后字符串的长度。

    发布订阅常用命令

    1.psubscribe pattern [pattern...]
    //订阅一个或多个符合给定模式的频道
    2.pubsub subcommand [argument[argument...]]
    //查看订阅与发布系统状态
    3.publish channel message
    将消息发送到指定的频道
    4.punsubscribe [pattern [pattern...]]
    退订所有给行模式的频道
    5.subscribe channel [channel...]
    订阅给定的一个或多个频道的信息
    6.unsubscribe [channel [channel...]]
    退订给定的频道

    实现原理

    1.订阅频道:pubsub_channels

     

    订阅频道操作(subscribe channel):
    1)如果已经存在订阅者,则添加到链表的尾部
    2)如果没有订阅者,那么创建频道,然后添加订阅者
    退订频道操作(unsubscribe channel):
    1)找到对应的链表,进行删除
    2)如果删除后,链表为空,则删除频道

    2.模式订阅:pubsub_patterns

     

    订阅模式频道操作(psubscribe pattern):
    1)新建一个pubsubPattern结构
    2)添加到链表的尾部
    退订模式频道操作(punsubscribe pattern):
    1)查找相应的pubsubPattern,然后删除
    发送消息:
    1)将消息发送给channel频道的所有订阅者
    2)遍历整个pubsub_patterns表,查找匹配的模式,如果有一个或者多个模式与频道匹配,将消息发送给pattern模式的订阅者

    事务

    Redis事务和一般的数据库事务的特性基本是一样的,都有两个特性:
    1)事务是一个单独的隔离操作
    2)事务是一个原子操作

     

    Redis事务的三个阶段:开始事务、命令入队、执行事务

     

    Redis事务命令:

     

    1.multi
    //标记一个事务块的开始
    //返回值:OK

     

    2.exec
    //执行所有事务块内的命令
    //返回值:事务块内所有命令的返回值,按命令执行的先后顺序排列。当操作被打断时,返回空值 nil 。

     

    3.discard
    //取消事务,放弃执行事务块内的所有命令
    //返回值:OK

     

    4.watch key [key...]
    //监视一个或多个key,如果在事务执行之前这个或这些key被其他命令所改动,那么事务将被打断
    //返回值:OK

     

    5.unwatch
    //取消watch命令对所有key的监视
    //返回值:OK

    执行脚本

    Redis脚本使用Lua解释器来执行脚本。

    Redis脚本命令

    1.eval script numkeys key [key ...] arg [arg ...]
    执行Lua脚本

    2.evalsha sha1 numkeys key[key ...] arg [arg ...]
    通过加载到内存中的Lua脚本的SHA1值执行Lua脚本

    3.script exists script [script ...]
    通过SHA1校验查看指定的脚本是否已经被保存在缓存当中

    4.script flush
    从脚本缓存中移除所有脚本

    5.script kill
    杀死当前正在运行的Lua脚本

    6.script load script
    将脚本script添加到脚本缓存中,但并不立即执行这个脚本

    客户端连接

    Redis连接命令主要是链接redis服务

    1.auth password
    //验证密码是否正确
    //返回值:密码匹配时返回OK,否则返回一个错误

    2.echo message
    //打印字符串,不能打印key的内容
    //返回值:返回字符串本身

    3.ping
    //查看服务是否运行
    //返回值:如果连接正常就返回一个PONG,否则返回一个连接错误

    4.quit
    //用于关闭当前客户端与redis服务的连接,一旦所有等待中的回复顺利写入到客户端,连接就会被关闭。
    //返回值:OK

    5.select index
    //用于切换到指定的数据库,数据库索引号index用数字值指定,以0作为起始索引值
    //返回值:OK

     

  • 相关阅读:
    Win32中精确计时器(微秒级)
    一个封装文件操作和目录操作的类
    CString
    两个经典的RGB与YUV转换函数
    C++文件流
    HSI、HSV、RGB、CMY、CMYK、HSL、HSB、Ycc、XYZ、Lab、YUV颜色模型
    MPEG4与H264区别,编码及应用
    C file文件基本知识
    RGB ,YUV, YCbCr的定义
    在android平台上测试C/C++程序及库
  • 原文地址:https://www.cnblogs.com/ScorchingSun/p/6606774.html
Copyright © 2020-2023  润新知