redis 学习笔记

loop_0 · · 523 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

#### redis安装 ###### linux 目录结构 * /bin&/sbin ;kernel 二进制可执行程序 * /usr/bin&/usr/sbin&/usr/lib ;(unix software resource) ubuntu/BSD/centOS... 等系统默认自带二进制 可执行程序/动态库 或 通过包管理工具(apt-get/yum)安装的二进制 可执行程序/动态库 * /usr/local/bin&/usr/local/sbin&urs/local/lib ;预留的安装目录, 用于存放用户手动编译安装的二进制 可执行程序/动态库 * /opt ;预留的安装目录, 用于存放用户通过软件安装包安装的大型软件 ###### redis 手动编译安装 ```makefile make MALLOC=libc make PREFIX=/usr/local install mkdir rundir/redis cp redis.conf rundir/redis ``` #### redis 使用 ###### redis 配置 ```shell #设置是否为守护进程 daemonize yes #配置文件默认绑定到127.0.0.1 注释后默认绑定到0.0.0.0 bind 127.0.0.1 #配置连接密码 requirepass xxxx # redis-server 根据配置文件启动 redis-server ./redis.conf ``` ###### redis 内存上限时的8种处理策略 ```shell # 从设置了存活时间的key-value中, 删除最不常使用或使用频率最低(lru和lfu两种判定算法)的key-value volatile-lru volatile-lfu # 从所有key-value中,删除最不常使用或使用频率最低(lru和lfu两种判定算法)的key-value allkey-lru allkey-lfu # 从设置了存活时间的key-value中, 随机删除key-value volatile-random # 从所有key-value中, 随机删除key-value allkey-random # 从设置了存活时间的key-value中, 删除最快要过期的key-value volatile-ttl # redis默认处理策略, 不会主动删除数据, 无法再进行写入操作,但仍然可以进行读取操作 Noeviction ``` ###### redis client参数 redis-cli [-h host] [-p port] [-a passwd] ###### redis 基本命令 ```shell # 登陆 auth passwd # 清空控制台 clear # 选择使用数据库 select db_number # 清空当前数据库 flushdb # 清空所有数据库 flushall # 将当前数据库中的key-value移动到另一个数据库 move key db_number # 删除一个或多个指定key-value del key1 key2 ... # 获取key对应value在内存中储存的数据(已被压缩过) dump key # 查看一个或多个指定key-value是否存在, 返回存在key-value的数量 exists key1 key2 ... # 为一个指定的key-value设定存活时间(秒) expire key second # 为一个指定的key-value设定存活时间(毫秒) pexpire key millisecond # 查看key-value的剩余存活时间(秒), 返回剩余时间, -1永久, -2无效不存在的key-valueu ttl key # 查看key-value的剩余存活时间(毫秒), 返回剩余时间, -1永久, -2无效不存在的key-valueu pttl key # 移除key-value的过期时间 persist key # 获取所有与pattern匹配的key (* 匹配所有, ? 匹配单个字符) keys pattern # 选择数据库, 一个redis-server默认开启16个数据库(0-15) select index # 从当前数据库中随机获取一个key randomkey # 重命名key rename key newkeyname # 将当前数据库key-value, 移动到其他数据库 mov key dbindex # 获取key对应value的类型信息, key不存在返回n5rone type key ``` ###### redis string命令 ```shell # 获取key对应value字符符串, 不存在返回nil get key # 获取key对应value字符串的子字符串 getrange key start end # mget 同时获取多个key对应的value字符串 meget key1 key2 ... # 设置key-value, 设置key-value,key不存在插入key-value,则存在则覆写value,无视value的类型一律作为字符串处理 set key value # 设置key-value,并设置存活时间(秒) set key value ex 1 # 设置key-value,并设置存活时间(毫秒) set key value px 1000 # 同时设置多个key-value, 无视value的类型一律作为字符串处理 不支持设置存活时间 mset key1 value1 key2 value2 ... # 如果key不存在,则设置key-value, 无视value的类型一律作为字符串处理,不支持设置存活时间 setnx key value # 先获取key对应value字符串的值, 再设置value字符串的值,不支持设置存活时间 getset key value # 获取key对应value字符串的长度 strlen key # incr命令将key对应value integer字符串自增1,如果value不是integer字符串则报错, 如果key-value不存在,那么key的值会先被初始化为"0",然后再执行incr操作, 返回自增后的integer incr key # incr命令指定自增量 incrby key increment # incr命令指定float自增量 incrbyfloat key increment # decr命令将key对应value integer字符串自减1,如果value不是integer字符串则报错, 如果key-value不存在,那么key的值会先被初始化为"0",然后再执行decr操作, 返回自增后的integer decr key # decr命令指定自减量 decrby key decrement # append命令为指定key对应的value字符串追加内容 append key tailstr ``` ###### redis hash命令 ```shell # 为指定key对应value hash表, 设置field/field_value hset key field field_value # 为指定key对应value hash表, 同时设置多个field/field_value hmset key field1 field_value1 field2 field_value2... # 获取指定key对应value hash表, 指定field的field_value hget key field # 获取指定key对应value hash表, 多个field的field_value hmget key field1 field2 ... # 获取指定key对应value hash表, 所有field/field_value信息 hgetall # 获取指定key对应value hash表, 所有field名信息 hkeys key # 获取指定key对应value hash表, 所有field数量 hlen key # 删除指定key对应value hash表, 指定一个或多个field/field_value, 当key对应的value hash表的所有字段被删除后, key-value也会被移除 hdel key field # 查看指定key对应value hash表, 指定field/field_value是否存在 hexist key field # 如果key-field不存在, 则设置field-value hsetnx key field value # 相当于对key-field执行incrby命令 hincrby key field increment # 相当于对key-field执行incrbyfloat命令 hincrbyfloat key field increment ``` ###### redis list命令 ```shell # 将一个或多个值从左到右依次插入队首 lpush key value1 value2 ... # 将一个或多个值从左到右依次插入到队尾 rpush key value1 value2 ... # 如果list存在则将一个值插入队首 lpushx key value # 如果list存在则将一个值插入队尾 rpushx key value # 从list的start元素开始遍历到stop元素 lrange key start stop #start开始索引, stop结束索引, stop为-1表示最后一个元素的索引, -2表示倒数第二个元素索引,依次类推 # 获取list长度, 如果key对应的list不存在则返回0 llen key # 根据index获取list中指定元素-1表示最后一个元素索引, -2表示倒数第二个, 依次类推 lindex key index # 获取并删除队首元素, list不存在则返回nil lpop key # 获取并删除队尾元素, list不存在返回nil rpop key # 获取并删除队首元素,该命令可以指定多个list,从任意一个list中lpop出一个元素即可,如果所有的list不存在则等待至超时,成功返回被lpop的list的key和lpop出的值,超时返回nil blpop key1 key2 key3 timeout # 获取并删除队尾元素,该命令可以指定多个list,从任意一个list中rpop出一个元素即可,如果所有的list不存在则等待至超时,成功返回被rpop的list的key和rpop出的值,超时返回nil brpop key1 key2 key3 timeout # 修剪list ltrim key start stop #start开始索引, stop结束索引, stop为-1表示最后一个元素的索引, -2表示倒数第二个元素索引,依次类推 # 设置制定索引元素的值, key不存在或索引无效则报错 lset key index value # 在与assign_value相等的第一个元素的前|后位置插入 linsert key before|after assign_value value #删除与assign_value相等的元素 lrem key count assign_value # count=0表示删除全部, count>0表示删除从队首开始匹配的前count个元素, count<表示删除从队尾开始匹配的前count个元素 # pop list1的队尾元素,push到list2的队首元素, 并返回该元素,list1不存在则返回nil rpoplpush key1 key2 ``` ###### redis set命令 ```shell # 向set中插入一个或多个不重复的值, 插入成功返回插入元素的个数, 插入重复元素时不会报错但也不会插入 sadd key value1 value2 # 获取set中元素的个数 scard key # 获取set中所有元素 smembers key # 判断指定的值是否在set中已经存在, 存在返回1,不存在返回0 sismembers key assign_value # 从set中随机获取count个元素的值 srandmember key count # 删除指定值的一个或多个元素,返回删除元素的个数 srem key assign_value1 assign_value2 # 随机删除count个元素 spop key count # 将set1中的指定值的元素移动到set2中 smove key1 key2 assign_value # 获取set1对set2, set3 ...的差积 sdiff key1 key2 key3 # 将set1对set2, set3 ...的差积保存在一个newset中 sdiffstore newkey key1 key2 key3 # 获取set1, set2, set3的交集 sinter key1 key2 key3 # 将set1, set2, set3的交集保存在一个newset中 sinterstroe newkey key1 key2 key3 # 获取set1, set2,set3的并集 sunion key1 key2 key3 # 将set1, set2, set3的并集保存在一个newset中 sunionstroe newkey key1 key2 key3 ``` ###### redis zset命令 ```shell # 向zset中插入一个或多个member不重复的(score member),或者修改zset中已经存在的(score member)元素的secore, 返回成功插入数据的个数 zadd key [nx|xx] score1 member1 score2 member2... #nx参数表示只进行插入不允许修改, xx表示只允许修改不允许插入 # 返回zset元素个数 zcard key # 根据score的升序,遍历zset zrange key start stop # 根据score的降序,遍历zset zrevrange key start stop # 获取score符合条件的元素个数 zcount key minscore maxscore # 获取指定member的rank zrank key assign_member # 删除指定一个或多个member zrem key assign_member1 assign_member2 # 根据分数删除一个区间 zremrangebyscore key minscore maxscore # 根据分数排行删除一个区间 zremrangebyrank key start stop ``` ###### redis 订阅和发布命令 ```shell # 订阅一个或多个channel subscribe channel1 channel2... # 向一个频道发布消息 publish channel message ``` ###### redis 事务 ```shell # 输入multi命令开始, 输入的命令都回依次进入命令队列中,但不会执行 # 直到输入exec后, redis会将队列中的命令依次执行 # 或直到输入discard后, redis会放弃命令队列 # 或直到出现指令语法解析错误, redis会放弃命令队列 multi hset user:1:name "loop" hset user:1:age "25" hset user:1:salary "12000+" exec multi set title "hello,loop" incr title discard # watch key1, key2... 监视一个或多个key, 如果事务执行之前这个(或这些)key被其它命令所改动,那么事务将被打断 watch title multi get title set title "hell,loop" # 此时title被其它客户端发送的命令修改 set title "hello,world" exec # 事务被打断,exec不会执行命令队列,返回nil # unwatch 取消watch命令对所有key的监视, 如果在执行watch命令之后,exec命令或discard命令先被执行的话, 那就不需要再执行unwatch了 unwatch # 事务 商品秒杀使用场景 watch produce:count #开启监视 get produce:count #此时程序判断是还有剩余商品,如果有则开启事务 multi decr produce:count rpush users "loop" exec ``` ###### redis 持久化机制 * rdb 数据快照 * 快照条件: * 服务器正常退出 redis-cli shutdown * key满足一定条件 在redis.conf文件中配置 save 900 1 save 300 10 save 60 10000 * aof 持久化 * 启用aof持久化 * 配置redis.conf appendonly yes * aof 的三种方式 * appendfsync always //受到写命令立即写入硬盘, 最慢, 但是保证完全的持久化 * appendfsync everysec //每秒钟写入磁盘一次, 在性能和持久化方面做了很好的折中 * appendfsync no

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

523 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传