zoukankan      html  css  js  c++  java
  • Redis(一)——Redis入门

    iwehdio的博客园:https://www.cnblogs.com/iwehdio/

    1、概述

    • Nosql:

      • 技术演进:

        • 单机MySQL时代,网站的瓶颈在数据量太多、数据索引太大、访问量太大。优化数据库的数据结构和索引,使用文件缓存。
        • Memcached缓存+MySQL+垂直拆分、读写分离,每次查询都读取数据库比较麻烦,希望用缓存减轻数据库压力。
        • 分库分表+水平拆分+MySQL集群,缓存主要解决读的压力,分库分表主要解决写的压力。
        • 数据量太大、变化太快,关系型数据库不够用了。
        • 负载均衡+APP服务器集群+MySQL集群+各种功能服务器。
      • 为什么要用Nosql:数据爆发式增长,关系型数据库难以处理。

      • 什么是Nosql:

        • Nosql=Not only sql。泛指非关系型数据库。
        • 关系型数据库:表格,行和列构筑。
        • 很多数据类型的存储不能按照固定的行列存储。比如使用键值对存储。
      • Nosql特点:

        • 方便扩展,数据之间没有关系。

        • 大数据量、高性能。

        • 缓存是记录级的,是细粒度的缓存,性能比较高。

        • 数据类型是多样型的,不需要事先设计数据库,随取随用。

        • 传统RDBMS和Nosql:

          传统RDBMS:
          - 结构化组织
          - SQL
          - 数据和关系都存在单独的表中
          - 数据操作语言,数据定义语言
          - 严格的一致性
          - 基础的事务
          
          Nosql:
          - 没有固定的查询语言
          - 键值对存储、列存储、文档存储、图形数据库
          - 最终一致性
          - CAP定理和BASE(异地多活)
          - 高性能、高可用、高可扩展、高并发
          
    • Nosql的四大分类:

      • KV键值对存储:redis。
      • 文档型数据库:MongoDB。
      • 列存储数据库:HBase。
      • 图形关系数据库:Neo4j。
    • redis:

      • 远程字典服务Remote Dictionary Server。也被称为结构化数据库。
      • 功能:
        • 内存存储、持久化。
        • 效率高,可以用于高速缓存。
        • 发布消息、订阅系统。
        • 地图信息分析。
        • 计时器、计数器。
      • 特性:
        • 多样的数据类型。
        • 持久化。
        • 集群。
        • 事务。
      • 默认端口号6379。
      • Windows下打开客户端和服务端:
        • ping 命令测试连通。
        • set k v/get k v存入和获取值。

    2、redis基础

    • 基础知识:

      • redis默认有16个数据库。默认使用第0个,可以使用select 编号切换数据库。
      • 查看数据库大小:dbsize
      • 查看所有的key:keys *
      • 清空全部/当前库:flushall/flushdb
      • redis是单线程的。因为redis是基于内存操作的,CPU不是redis的性能瓶颈,而是机器的内存和网络带宽。
      • 为什么单线程还这么快:redis是将所有的数据全部放在内存中的。避免了多线程导致的CPU上下文切换的资源浪费。使用了多路复用IO。
    • redis的作用:数据库、缓存和消息中间件MQ。

    • Redis-key的基本命令:

      • 判断某个键是否存在:exists 键名
      • 移除某个键值对:move 键名 数据库编号
      • 设置过期时间:expire 键名 秒数
      • 查看剩余的时间:ttl 键名
      • 查看当前key的类型:type 键名
    • 五个基本数据类型:

      • String字符串类型:
        • 存入键值对:set 键名 值
        • 获取键值对:get 键名
        • 给值追加字符串:append 键名 追加的值。返回追加后的长度。
        • 获得值的长度:strlen 键名
        • 给数字字符串加一:incr 键名
        • 给数字减一:decr 键名
        • 给数字加n:incrby 键名 n
        • 给数字减n:decrby 键名 n
        • 范围截取字符串:getrange 键名 start end。从0开始,双闭区间。
        • 字符替换:setrange 键名 offset 值。从偏移量开始进行替换。返回替换后的长度。
        • 设置过期时间:setex 键名 秒数 值
        • 如果不存在再设置:setnx 键名 值。存入成功返回值是1,失败返回0。
        • 批量设置:mset k1 v1 k2 v2
        • 批量获取:mget k1 k2
        • 如果不存在再设置:msetnx k1 v1 k2 v2。是一个原子性的操作,k1存在k2不存在,k2也无法设置成功。
        • 通过设计key存入对象:mset user:1:name lisi user:1:age 14
        • 先get再set:getset 键名 值。如果get不到则返回nil,并且设置新值。
      • String类型的使用场景:
        • 计数器,统计粉丝的数量。
        • 对象缓存存储。
      • List列表类型:
        • 根据元素的出入规则,可以作为队列(阻塞队列)或栈使用。
        • 大部分的List命令都是l开头的。
        • 压入列表(插入列表头部,左):lpush 键名 值
        • 压入列表(插入列表尾部,右):rpush 键名 值
        • 获取列表中的值:lrange start end
        • 移除列表(从列表头部,左):lpop 键名。返回取出的值。
        • 移除列表(从列表尾部,右):rpop 键名
        • 根据索引获取值:lindex 键名 索引
        • 删除指定数量的值:lrem 键名 数量 值。返回移除的值的数量。
        • 列表长度:llen 键名
        • 列表截断:ltrim start end。移除两侧的元素。
        • 移除列表最后一个元素并且添加到一个新的列表:rpoplpush 原键名 新键名。还有其他不同的r/l组合。
        • 判断列表中是否有值:exists 键名,返回0则没有值。
        • 根据索引更新值:lset 键名 索引 值。列表必须已经存在,而且不能设置越界的索引。
        • 插入值:linsert 键名 before/after 基准的值 新的值。返回插入后的列表长度。
      • List类型的实现:
        • redis中的列表实际上是一个链表。
        • 在两边插入或者改动值,效率最高。
      • Set集合类型:
        • Set中的值是不能重复的,是无序的。
        • 大部分的Set命令都是s开头的。
        • 往集合中添加值:sadd 键名 值,返回1添加成功,返回0添加失败。
        • 集合中的所有值:smembers 键名
        • 判断集合中有没有此元素:sismember 键名 值,返回0说明有,返回1说明没有。
        • 获取集合大小:scard 键名
        • 从集合中移除元素:srem 键名 值
        • 随机抽取一个元素:srandmember 键名 取出的数量
        • 随机删除元素:spop 键名,返回移除的元素。
        • 将一个指定的值移动到另外的集合中:smove 原键名 新键名 值,返回1表示成功,0表示失败。
        • 取差集:sdiff 键名1 键名2
        • 取交集:sinter 键名1 键名2
        • 取并集:sunion 键名1 键名2
      • Set类型的使用场景:
        • 将一个用户的粉丝放在集合中,交集作为共同关注的实现。
      • Hash哈希类型:
        • 可以认为是一个map集合,即key-map结构。
        • 大部分的Hash命令都是h开头的。
        • 往哈希中添加值:hset 键名 字段名 值,返回1成功,0失败。
        • 从哈希中获取值:hget 键名 字段名
        • 批量添加值:hmset 键名 k1 v1 k2 v2
        • 批量获取值:hmget 键名 k1 k2
        • 获取所有的数据:hgetall 键名。
        • 删除操作:hdel 键名 字段名,返回1成功,0失败。
        • 获取哈希的大小:hlen 键名
        • 判断哈希中的某个字段是否存在:hexists 键名 字段名,返回1存在,0不存在。
        • 只获取哈希的所有字段:hkeys 键名
        • 只获取哈希的所有值:hvals 键名
        • 使字段对应的值自增:hincrby 键名 字段名 步长,返回自增的结果。
        • 如果不存在则设置:hsetnx 键名 字段名 值
      • Hash类型的使用场景:
        • 存入变更的数据,比如存入一个对象的数据。
      • Zset有序集合类型:
        • 在Set的基础上,增加了一个值作为分数。
        • 添加操作:zadd 键名 分数 值,返回1添加成功,0失败。
        • 根据分数排序排序:zrangebyscore 键名 -inf +inf ,最小最大值设置为无穷。加withscores可以输出分数。
        • 倒序输出:zrevrange 键名 start end
        • 输入所有元素:zrange 键名 start end
        • 移除元素:zrem 键名 值 ,返回1移除成功。
        • 集合的大小:zcard 键名
        • 获取指定分数区间的元素数量:zcount 键名 min max,返回元素数量。
      • Zset类型应用场景:
        • 存储班级成绩表、工资表排序。
        • 设置不同消息的权重,显示重要类型。
        • 排行榜应用实现。
    • 三种特殊数据类型:

      • geospatial地理位置:
        • 一般会下载城市数据,通过程序一次性导入。有效的经度从-180道180,有效的纬度从-85到85。
        • geo的底层实现是Zset,可以用Zset的命令操作geo。
        • 添加地理位置:geoadd 键名 经度 纬度 字段名 ,返回添加成功的数量。
        • 从指定的键中获取定位的经纬度:geopos 键名 字段名
        • 两个定位之间的距离:geodist 键名 字段1 字段2 ,默认返回的单位是米。
        • 以给定定位为中心,找出半径内的元素:georadius 键名 经度 纬度 半径
        • 以给定元素为中心,找出半径内的元素:georadiusbymember 键名 字段名 半径
        • 返回位置的geohash表示:geohash 键名 字段名
      • geospatial类型的应用场景:
        • 朋友定位、附近的人。
        • 打车距离、城市经度纬度查询。
      • hyperloglog基数统计:
        • 基数:不重复的元素个数,数字非常大时可以接受误差(0.81%)。
        • 优点:占用的内存是固定的12KB,相比使用Set集合节省内存。
        • 添加元素:pfadd 键名 元素,返回1表示成功。
        • 统计元素个数:pfcount 键名
        • 合并操作:pfmerge 目标键名 源键名1 源键名2
      • hyperloglog类型应用场景:
        • 一个人访问一个网站多次,但还是算作一个人。
      • bitmap位图数据:
        • 设置值:setbit 键名 offset 值。值只能存0或1。返回0表示新建,1表示覆盖。
        • 查看值:getbit 键名 offset
        • 统计1的数量:bitcount 键名 start end
      • bitmap类型应用场景:
        • 存储打卡信息。
        • 只有两个状态的情况。

    来源与结束于否定之否定。
  • 相关阅读:
    Kettle学习(2)
    kettle学习(1)
    Quartz在Spring中的使用
    JVM垃圾收集简介
    快速排序

    20190827最新论文
    GNN
    Multimodal Machine Learning
    Wasserstein距离 及两多元高斯分布间的W距离
  • 原文地址:https://www.cnblogs.com/iwehdio/p/13581358.html
Copyright © 2011-2022 走看看