Redis常用命令

251 阅读17分钟

Redis 第一天

[TOC]

Redis的介绍

  • Redis的定义

    • Redis是开源的、遵守BSD协议

    • Redis是一个高性能的key-value存储系统

    • Redis和Memcached类似

    • Redis支持存储的value类型相对更多

    • Redis的数据类型

      数据类型名称 数据名称英文
      字符串 string
      链表 list
      集合 set
      有序集合 zset
      哈希 hashs
  • Redis的作用

    • Redis 是一个高性能的key-value数据库。
    • Redis的出现,很大程度补偿了memcached这类key/value存储的不足。
    • 在部分场合可以对关系数据库起到很好的补充作用。
    • 它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。
    • 目前最新版本3.6.0
  • Redis的特点

    • 持久性
      • Redis支持数据的持久化
      • 可以将内存中的数据保存在磁盘中
      • 重启的时候可以再次加载进行使用
    • 多样性
      • Redis不仅仅支持简单的key-value类型的数据
      • 同时还提供list,set,zset,hash等数据结构的存储
    • 安全性
      • Redis支持数据的备份
      • 即master-slave模式的数据备份
  • Redis的别名

    • 数据结构服务器
      • Redis 是完全开源免费的,遵守BSD协议,先进的key-value持久化产品
    • 内存级数据库
      • 一个基于内存的网络存储系统
    • 远程字典服务器
      • Remote Dictionary Server
  • Redis的适用场景

    • 取最新 N 个数据的操作
    • 排行榜应用,取 TOP N 操作
    • 需要精准设定过期时间的应用
    • 计数器应用
    • Uniq 操作,获取某段时间所有数据排重值
    • 实时系统,反垃圾系统
    • Pub/Sub 构建实时消息系统
    • 构建队列系统
    • 缓存
  • Redis的优势

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

    1. Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。
    2. Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
    3. Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,
    4. 因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,
    5. 在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。
    6. 同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

Redis的安装

  • Linux下的ubuntu下的Redis的安装
    • apt-get源安装
      • $sudo apt-get update
      • $sudo apt-get install redis-server
    • 启动Redis
      • $ redis-server
    • 查看redis是否启动
      • $ redis-cli
    • Redis中测试
      • PING
        • PONG则代表安装成功
  • Windows下的Redis的安装
    • 在浏览器访问地址
    • 打开CMD窗口
    • 使用CD命令进入Redis目录
    • 运行代码
      • redis-server.exe redis.windows.conf
    • 打开一个新的CMD窗口
    • 原先的窗口不要关,不然无法访问服务端
    • 切换到Redis目录
    • 运行代码
      • redis-cli.exe -h 127.0.0.1 -p 6379

Redis的数据类型

命令中的NX表示如果 Key不存在就添加

存在则直接返回失败

用于方式覆盖

String( 字符串 )

  • String的简介
    • String是最简单的类型,一个Key对应一个Value。
    • String类型是二进制的。
    • String可以包含任何数据,比如jpg图片或者序列化的对象。
  • 设置( 添加 )键值对( SET )
    • set 键的名称 该键对应的值
      • set Key Value
    • 设置一个键和值,键存在则覆盖,返回ok
  • 查看键值对( GET )
    • get 键的名称
      • get Key
    • 返回一个键的值
  • 设置( 添加 )键值对( SETNX )
    • setnx 键的名称 该键对应的值
      • setnx Key Value
    • 只有当该键不存在时设置一个键的值
    • 若键已存在则返回0表示失败( 防止覆盖 )
  • 设置( 添加 )一个有过期时间的键值对 ( SETEX )
    • setex 键的名称 有效的时间 该键对应的值
      • setex Key time Value
  • 查看键值对剩余存在时间( TTL )
    • ttl 键的名称
      • ttl Key
    • 以秒为单位,返回给定键的剩余生存时间
      • 当键不存在时,返回 -2 。
      • 当键存在但没有设置剩余生存时间时,返回 -1 。
  • 替换字符串( SETRANGE )
    • setrange 键的名称 指定要被替换的字串的位置 要替换的字串
      • setrange Key num string
    • 指定要被替换的字串的位置从0开始
    • 替换字符串( 半覆盖 )
    • 替换长度由字串长度决定
    • abcdefg从c开始替换bad,结果为abbadfg
  • 批量设置( 添加 )键值对( MSET )
    • mset 键1 值1 键2 值2 键3 值3
      • mset V1 K1 V2 K2 V3 K3
    • 批量设置键和值
      • 成功则返回ok
  • 批量获取( MGET )
    • mget 键1 键2 键3
      • mget k1 k2 k3
    • 批量获取指定键的值
  • 批量设置( 添加 )键值对( MSETNX )
    • msetnx 键1 值1 键2 值2 键3 值3
      • msetnx K1 V1 K2 V2 K3 V3
    • 批量设置不存在的键和值
      • 当键不存在时候才成功
      • 成功则返回OK
      • 当被设置的键已存在时,该设置全部不成功
  • 查看并更改键值对的值( GETSET )
    • getset 键的名称 该键对应的值
      • getset Key Value
    • 获取原值,并设置新值
  • 获取指定键值对的值( GETRANGE )
    • getrange 键的名称 开始的位置 结束的位置
      • getrange Key Start End
    • 获取指定范围的值( 获取指定Start到End位置上的值 )
    • 字符串位置从0开始计算
  • 给键值对的值做+1( INCR )
    • incr 键的名称
      • incr Key
    • 指定键的值做加1操作
    • 值必须为数字
    • 返回加后的结果
  • 给键值对的值做+n( INCRBY )
    • incrby 键的名称 增加的数字
      • incrby Key num
    • 指定键的值做加num操作
    • 值必须为数字
    • 返回加后的结果
    • 键不存在时候会设置键
    • num可以是正整数或负整数
  • 给键值对的值做-1( DECR )
    • decr 键的名称
      • decr Key
    • 指定键的值做减1操作
    • 值必须为数字
    • 返回减后的结果
  • 给键值对的值做-n( DECRBY )
    • decrby 键的名称 要减的数字
      • decrby Key num
    • 指定键的值做加num操作
    • 值必须为数字
    • 返回减后的结果
    • 键值对不存在时候会设置键值对
    • num可以是正整数或负整数
  • 追加键值对的值( APPEND )
    • append 键的名称 要追加的字符串
      • append Key String
    • 给指定键的值追加字符串
    • 返回新值的长度
  • 获取键的长度( STRLEN )
    • strlen 键的名称
      • strlen Key
    • 获取一个键长度
    • 返回长度

hashs( 哈希 )

  • 哈希与字符串的区别
    • String( 字符串 )
      • 所有的值(可以是任何数据类型)都保存在一个键当中
      • 放在一个内存块中
    • Hashs( 哈希 )
      • 所有的值也都保存在一个键当中
      • 放在不同的内存块中
      • 每个块称作字段
  • 设置( 添加 )一个键值对( HSET )
    • hset 键的名称 字段名 该字段的值
      • hset Key Field Value
    • 设置一个键,在键中保存字段和值
  • 设置( 添加 )一个键值对( HSETNX )
    • hsetnx 键的名称 字段名 该字段的值
      • hsetnx Key Field Value
    • 设置一个键中不存在的字段和值
    • 字段存在则报错
    • 成功返回1
    • 失败返回0
  • 批量设置键值对中字段的值( HMSET )
    • hmset 键的名称 字段名 该字段的值 字段名 该字段的值 字段名 该字段的值
      • hmset Key Field1 Value1 Field2 Value2 Field3 Value3
    • 在一个键中,批量设置字段
  • 获取指定键的指定字段的值( HGET )
    • hget 键的名称 字段名
      • hget Key Field
    • 获取键中的一个指定字段的值
  • 获取指定键的多个指定字段的值( HMGET )
    • hmget 键的名称 字段名1 字段名2 字段名3
      • hmget Key Field1 Field2 Field3
    • 获取键中一个或多个字段的值
  • 判断字段是否在键中( HEXISTS )
    • hexists 键的名称 字段名
      • hexists Key Field
    • 判断指定的字段是否存在于键中
    • 存在返回1
    • 不存在返回0
  • 获取指定键的字段数量( HLEN )
    • hlen 键的名称
      • hlen Key
    • 返回指定键的字段的数量
  • 获取键中所有的字段名( HKEYS )
    • hkeys 键的名称
      • hkeys Key
    • 获取键中的所有字段名
    • 返回指定键所有的字段名
  • 获取键中所有的字段值( HVALS )
    • hvals 键的名称
      • hvals Key
    • 获取键中的所有字段值
    • 返回指定键所有的字段值
  • 获取键中的所有的字段名和字段值( HGETALL )
    • hgetall 键的名称
      • hgetall Key
    • 获取键中的所有字段和值
  • 给键中指定字段值做+n( HINCRBY )
    • hincrby 键的名称 字段名 要加的值
      • hincrby Key Field num
    • 将键中指定字段的值,增加指定的数字
    • 字段值必须为数字
  • 删除一个或多个字段( HDEL )
    • hdel 键的名称 字段名1 字段名2 字段名3
      • hdel Key Field1 Field2 Field3
    • 删除键中的一个或多个字段

List( 链表 )

  • List的简介
    • List是一个链表结构
    • List主要功能是push、pop、获取一个范围的所有值
    • List操作中Key理解为链表的名字
    • List其实就是一个 每个子元素都是string类型的双向链表
    • List允许有重复值
  • 从头插一个或多个值( LPUSH )
    • lpush 键的名称 该键的值1 该键的值2 该键的值3
      • lpush Key Value1 Value2 Value3
    • 从队列左边向队列写入一个或多个值
    • 队列的左面为队列头
    • 右边为队列尾
  • 从列表中取指定值( LRANGE )
    • lrange 键的名称 起始下标 终止下标
      • lrange Key Start End
    • 从队列中获取指定的返回值
    • 从队列左边向右获取
    • 下标
      • 0代表队列中第一个元素
      • 1代表第二个元素,依次类推
      • -1代表队列中最后一个元素
      • -2代表倒数第二个元素,依次类推
  • 从尾插一个或多个值( RPUSH )
    • rpush 键的名称 该键的值1 该键的值2 该键的值3
      • rpush Key Value1 Value2 Value3
    • 从队列右边向队列写入一个或多个值
  • 在指定位置插一个值( LINSERT )
    • linset 键的名称 之前/之后 作为定位的值 要插入的值
      • linsert Key before / after Value1 Value2
    • 在队列中指定元素之前或之后插入新值
  • 修改键中指定的值( LSET )
    • lset 键的名称 指定下标 新值
      • lset Key num Value
    • 给队列中指定元素设定新值
  • 删除键中指定的指定数量的值( LREM )
    • lrem 键的名称 要删除的值的数量 要删除的值
      • lrem Key num Value
    • 从队列中删除num个值为要删除的值的元素
    • num > 0 从队列头向尾删除num个元素
    • num < 0 从队列尾向头删除num个元素
    • num = 0 删除所有值为要删除的值的元素
  • 修剪队列( LTRIM )
    • ltrim 键的名称 起始下标 结束下标
      • ltrim Key Start End
    • 修剪队列
    • 让队列只保留指定指定范围内的元素
  • 删除第一个值( LPOP )
    • lpop 键的名称
      • lpop Key
    • 从指定的队列左面移除一个值
  • 删除最后一个值( RPOP )
    • rpop 键的名称
      • rpop Key
    • 从指定队列的右边移除一个值
  • 删除原队列中最后一个值并把该值写入另一个队列( RPOPLPUSH )
    • rpoplpush 原队列的键名称 另一个队列的键名称
      • rpoplpush Key1 Key2
    • 移除源队列的最后一个元素
    • 把该元素写入到目标队列的队首
    • 两队列可是同一个
      • 该操作等于将最右的那个放到最左
      • 也就是将最后一个放到第一个
  • 获取指定的值( LINDEX )
    • lindex 键的名称 指定下标
      • lindex Key num
    • 获取队列中指定下标元素的值
  • 获取队列的长度( LLEN )
    • llen 键的名称
      • llen Key
    • 获得队列的长度

Sets( 无序集合 )

  • Sets的简介
    • Sets是集合
    • Sets是string类型的无序集合
    • 通过哈希来操作的
    • 对Sets我们可以取并集、交集、差集
    • 通过这些操作我们可以实现社交网站中的好友推荐和blog的tag功能
    • Sets不允许有重复值
  • 设置( 添加 )值到集合( SADD )
    • sadd 键的名称 该键的值1 该键的值2 该键的值3
      • sadd Key Value1 Value2 Value3
    • 添加一个或多个元素到集合中
  • 获取集合中的所有值( SMEMBERS )
    • smembers 键的名称
      • smembers Key
    • 获取集合里面所有的元素
  • 删除集合中的一个或多个值( SREM )
    • srem 键的名称 该键的值1 该键的值2
      • srem Key Value1 Value2
    • 从集合中删除指定的一个或多个元素
  • 随机删除集合中的一个元素( SPOP )
    • spop 键的名称
      • spop Key
    • 随机从集合中删除一个元素
    • 并返回被删除的元素
  • 随机获取集合中的一个或多个元素( SRANDMEMBER )
    • srandmember 键的名称 返回数量
      • srandmember Key Num
    • 随机返回集合中一个或多个元素,但不删除
  • 获取集合元素的个数( SCARD )
    • scard 键的名称
      • scard Key
    • 获取集合里面元素个数
  • 判读是否为集合的元素( SISMEMBER )
    • sismember 键的名称 指定的值
      • sismember Key Value
    • 确定一个指定的值是否是集合中的元素
      • 是返回1
      • 不是返回0
  • 返回两个结合的差集( SDIFF )
    • sdiff 键的名称1 键的名称2
      • sdiff Key1 Key2
    • 返回集合1与集合2的差集。以集合1为主
  • 将两个集合的差集放入一个新集合( SDIFFSTORE )
    • sdiffstore 新键的名称 键的名称1 键的名称2
      • sdiffstore Key-N Key1 Key2
    • 返回集合1和集合2的差集,并把结果存入新集合
  • 获得两个集合的交集( SINTER )
    • sinter 键的名称1 键的名称2
      • sinter Key1 Key2
    • 获得两个集合的交集
  • 将两个集合的交集放入一个新集合( SINTERSTORE )
    • sinterstore 新键的名称 键的名称1 键的名称2
      • sinterstore Key-N Key1 Key2
    • 获得集合1和集合2的交集,并把结果存入新集合
  • 获得两个集合的并集( SUNION )
    • sunion 键的名称1 键的名称2
      • sunion Key1 Key2
    • 获得指定集合的并集
  • 将两个集合的并集放入一个新集合( SUNIONSTORE )
    • sunionstore 新建的名称 键的名称1 键的名称2
      • sunionstore Key-N Key1 Key2
    • 获得指定集合的并集,并把结果保存如新集合
  • 将一个集合的指定值放到另一个集合( SMOVE )
    • smove 被移动的键的名称 被移动到的键的名称 要移动的值
      • smove Key-O Key-N Value
    • 将指定的值从源集合移动到目标集合

Sorted Sets( 有序集合 )

  • Sorted Sets的简介
    • Sorted Sets是Sets的一个升级版本
    • Sorted Sets给集合中每个元素都定义一个分数
    • Sorted Sets中的元素按照其分数排序
    • Sorted Sets不允许有重复值
    • Sorted Sets中每个成员都有一个分数
    • Sorted Sets中你可以指定多个分数/成员组合
    • Sorted Sets中如果一个指定的成员已经在对应的有序集合中了
    • 那么其分数就会被更新成最新的
    • 并且该成员会重新调整到正确的位置
    • 以确保集合有序
    • Sorted Sets中分数的值必须是一个表示数字的字符串
    • 并且可以是double类型的浮点数
  • 设置( 添加 )键分数值对( ZADD )
    • zadd 键的名称 分数1 该数分数的值1 分数2 该数分数的值2
      • zadd Key Score1 Value1 Score2 Value2
    • 该命令添加指定的成员到Key对应的有序集合
  • 返回集合中指定的值( ZRANGE )
    • zrange 键的名称 起始下标 截止下标 [是否返回其分数]
      • zrange Key Start End [withscores]
    • 返回有序集合中,指定区间内的成员
    • 其中成员按照score(分数)值从小到大排序
    • 具有相同score值的成员按照字典顺序来排列
    • withscores
      • 返回集合中元素的同时
      • 返回其分数(score)
  • 返回集合中指定的值( ZREVRANGE )
    • zrevrange 键的名称 起始下标 截止下标 [是否返回其分数]
      • zrevrange Key Start End [withscores]
    • 返回有序集合中,指定区间的成员
    • 其成员按照score从大到小来排列
    • 具有相同score值的成员按照字典顺序来排列
    • withscores
      • 返回集合中元素的同时
      • 返回其分数(score)
  • 返回集合中的指定分数的值( ZRANGEBYSCORE )
    • zrangebyscore 键的名称 集合 起始分数 截止分数 [是否返回其分数]
      • zrangebyscore Key Num-S Num-E [withscores]
    • 返回有序集合中score(分数)在指定区间的值
    • 具有相同score值的成员按照字典顺序来排列
    • withscores
      • 返回集合中元素的同时
      • 返回其分数(score)
  • 删除集合中的指定值( ZREM )
    • zrem 键的的名称 该键的值1 该键的值2
      • zrem Key Value1 Value2
    • 删除有序集合中指定的值
  • 给集合中的值的分数做+n( ZINCRBY )
    • zincrby 键的名称 增量 要增加分数的值
      • zincrby Key num Value-S
    • 给有序集合中指定值的成员的分数(score)值加上增量(num)
    • 如果集合中没有这个值,则给添加一个分数是num的值
  • 返回集合中指定的值( ZRANK )
    • zrank 键的名称 指定的值
      • zrank Key Value
    • 返回有序集合中指定值的下标
    • 值按照score从小到大排序
  • 返回集合中的指定的值( ZREVRANK )
    • zrevrank 键的名称 指定的值
      • zrevrank Key Value
    • 返回有序集合中指定值的下标
    • 值按照score从大到小排序
  • 返回集合中指定分数之间值的个数( ZCOUNT )
    • zcount 键的名称 起始分数 截止分数
      • zcount Num-S Num-E
    • 返回有序集合中
    • score值在起始分数与截止分数之间的个数
  • 返回集合中的值的个数( ZCARD )
    • zcard 键的名称
      • zcard Key
    • 返回有序集合元素的个数
  • 删除集合中指定分数区间的值( ZREMRANGEBYSCORE )
    • zremrangebyscore 键的名称 起始分数 截止分数
      • zremrangebyscore Key Num-S Num-E
    • 删除有序集合中
    • 分数在指定区间的元素
  • 将多个集合的交集放到一个新的集合中( ZINTERSTORE )
    • zinterstore 新键的名称 取交集的集合个数 键的名称1 键的名称2
      • zinterstore Key-N num Key1 Key2
    • 取集合1和集合2的交集,并把结果保存到新集合中
    • 在计算交集之前,需要指定计算交集的集合的个数
    • 交集中,值的分数是多个集合中分数的和
  • 将多个集合的并集放到一个新的集合中( ZUNIONSTORE )
    • zunionstore 新键的名称 取并集的集合的个数 键的名称1 键的名称2
      • zunionstore Key-N num Key1 Key2
    • 取集合1和集合2的并集,并把结果保存到新集合中
    • 在计算并集之前,需要指定计算并集的集合的个数
    • 并集中,值的分数是多个集合中分数的和。

各个数据类型的选择

数据类型 适合做的工作
哈希类型( Hashs ) 适合做数据缓存
链表类型( List ) 适合做数组搜索
无序集合类型( Sets ) 适合做好友推送
有序集合类型( Sorted Sets) 适合商品排序

PS

  • 查找指定键( KEYS )
    • keys 键的名称
      • keys K?e*y
    • 支持通配符
    • 查看库中所有的键
      • keys *
  • 删除键值对( DEL )
    • del 键的名称
      • del Key
    • 删除一个键
      • 成功返回1
      • 失败即键值对不存在返回0
  • Redis的启用步骤
    • 首先,在服务器装redis. 记得更改配置
    • 其次,安装php-redis
    • 随后,你得知道基本的语句