1.Redis是什么?

2.Redis的作用

3.Nosql数据库的介绍

3.1Nosql与sql数据库的区别

3.2行式数据库与列式数据库的优缺点

4.Redis数据库的安装过程

5.Redis的数据类型介绍以及使用

5.1Redis(key键)(用<>的就是参数)

  • key * 查看当前库的所有的键
  • exists 查看key是否存在
  • type 查看当前键的类型
  • del 删除指定键的数据
  • expire 给指定的key设置过期的时间
  • ttl 查看key还有多长时间过期
  • select 选择数据库
  • dbsize 查看当前数据库中的key的个数
  • flushdb 清空当前库
  • flushall 清空所有库

    5.2Redis字符串(strings)(value值)

    5.2.1常用的命令

  • set 添加键值对

  • mset 添加多个键值对
  • get 获取对应的键值
  • mget 一次获取多个key的值
  • append 将value的值添加到 的末尾
  • strlen 获取value值的长度
  • setnx 只有当key的值不存在的时候设置key的值
  • incr (原子操作) 将key的值加一,只能对数字进行操作
  • decr (原子操作) 将key中储存的数字值减一
  • getrange <起始位置> <结束位置> 获得值的范围类似于java中的substring()
  • setex <过期的时间> 设置键值的同时设置了过期的时间
  • getset 获得旧值,并用新值进行替换

    5.2.2数据结构

  • 特点:二进制安全的,最大值为512M

    • 可以包含任何数据,如简单的字符串,图片
  • 源码结构:

    1. struct SDS {
    2. // 数组容量
    3. T capacity; //分配的字符的长度
    4. // 数组长度
    5. T len; //实际存储的字符的长度
    6. // 特殊标识位
    7. byte flags;
    8. // 数组内容
    9. byte[] buf;
    10. }
    11. 1.数组的长度采用泛型,长度比较短的时候可以采用byte,short进行存储
  • 存储结构示意图

image.png

  • capacity的分配策略
    • 如果capacity长度不可以存储新增的字符,需要扩容
    • 如果len<=1MB,则加倍进行扩容,capacity*2,然后继续判断
    • 如果len>1MB,一次只会增加1MB的空闲空间,然后继续判断
    • 字符串最大扩容到512MB

      5.2.3应用场景

  1. 计数器
    1. incr和decr的命令是将key中存储的数字的值,加1和减1用来计算。如:点赞数,评论数,分享数
  2. 分布式锁(不理解)
    1. setnx的作用,是当key不存在时,设置值并返回1,当key已经存在,不设置值并返回0,而这个操作也是原子性的,所以可以用来做分布式锁。返回1表示获得到了锁,返回0表示没有获得到锁;然后使用del删除key来释放锁。可以同时给key设置一个过期时间,这样当del删除失败时,也可以保证锁能够释放。
  3. 缓存(最常用的)
    1. set可以存储值,可将数据对象进行序列化操作时候进行缓存
  4. 用户签到记录
    1. 可以使用位图(byte数组)来记录用户的签到记录,每天的签到记录只占据一个位,365天就是365个位,46个字节就可以完全容纳下。

      5.3Redis列表(lists)

      5.3.1 简介

  • 特点:有序,不唯一

    5.3.2 常用命令

    | lpush/rpush | 从左边/右边插入一个或多个值 | | —- | —- | | lpop/rpop | 从左边/右边吐出一个值。值在键在,值光键亡。 | | rpoplpush | 从右边吐出一个值,插到列表的左边 | | lrange (0 ,-1) | 按照索引下标获得元素(从左到右) | | lindex | 按照索引的下表获取元素 | | llen | 获取key的值的长度 | | linsert before/after | 在的后面/前面插入插入值 | | lrem | 从左边删除n个value | | lset | 将列表key下标为index的值替换成value |

5.3.3数据结构

  1. 大体上看来是一个链表
  2. 实际上是数组加链表
  3. 在元素列表元素比较少 的时候会用ziplist称为为压缩列表,分配一块连续的内存
  4. 数据量比较多的时候会改成quiteList
  5. 这样既满足了插入删除的性能,又不会浪费空间image.png

    5.4Redis集合(set)

    5.4.1简介

  • Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)

    5.4.2常用的命令

    | sadd | 将一个或者多个key添加到set里面 | | —- | —- | | smembers | 取出该集合的所有值 | | sismember | 判断是不是有这个key,如果有返回1,否则返回0 | | scard | 返回这个集合中的数量 | | srem | 删除集合中的某个元素或者多个元素 | | spop | 随机从该集合中吐出一个值 | | sinter | 返回两个集合的交集 | | sunion | 返回两个集合的并集 | | sdiff | 返回两个集合的差集 - |

5.4.3数据结构(有待整理)

  • set的数据结构是dict字典,字典使用哈希表实现的

    5.5Redis有序集合(zset)

    5.5.1简介

  • zset和set基本是一样的主要是zset增加了一个评分(score),可以根据这个评分进行排序,评分是可以一样的

  • 特点:
    • 可以根据评分,和postion去获取一个范围的值

      5.5.2 常用的命令

      | zadd | 将一个或者多个member及score的值添加到有序集key中 | | —- | —- | | zrange (下标问题) | 返回下标在之间的元素 | | zrange | 可以带分数一起去返回 | | zrangebyscore key min max [withscores] [limit offset count] | 返回有序key,分数在min<==>max的分数按递增排序 | | zrevrangebyscore key max min [withscores] [limit offset count] | 同上,从大到小 | | zincrby | 为分数添加增量 | | zrem | 删除该集合下,指定值的元素 | | zcount | 统计该集合,分数区间的元素个数 | | zrank | 返回该值在集合中排名 从0 开始 |

5.5.3数据结构

  • zset采用了两种数据结构
    • 1.hash:关联value和权重score,保障value元素的唯一性,可以通过value找到对应的score
    • 2.跳跃表,跳跃表的目的在于给score排序,根据score的范围获取元素的列表
  • 跳跃表
  1. 简介

    有序集合在生活中比较常见,例如根据成绩对学生排名,根据得分对玩家排名等。对于有序集合的底层实现,可以用数组、平衡树、链表等。数组不便元素的插入、删除;平衡树或红黑树虽然效率高但结构复杂;链表查询需要遍历所有效率低。Redis采用的是跳跃表。跳跃表效率堪比红黑树,实现远比红黑树简单。

  2. 实例

对比有序链表和跳跃表,从链表中查询出51
(1) 有序链表
image.png
要查找值为51的元素,需要从第一个元素开始依次查找、比较才能找到。共需要6次比较。
(2) 跳跃表
image.png
从第2层开始,1节点比51节点小,向后比较。
21节点比51节点小,继续向后比较,后面就是NULL了,所以从21节点向下到第1层
在第1层,41节点比51节点小,继续向后,61节点比51节点大,所以从41向下
在第0层,51节点为要查找的节点,节点被找到,共查找4次。
从此可以看出跳跃表比有序链表效率要高

5.6Redis哈希(hashes)

5.6.1简介

  • 是一个键值对集合
  • 是一个string类型的field和value的映射表,hash特别适合用于存储对象。

    5.6.2常用的命令

    | hset | 给key中的field赋值 | | —- | —- | | hget | 从取值 | | hmset … | 批量设置hash的值 | | hexists | 查看哈希表 key 中,给定域 field 是否存在 | | hkeys | 列出该hash集合的所有field | | hvals | 列出该hash集合的所有value | | hincrby | 为哈希表 key 中的域 field 的值加上增量 1 -1 | | hsetnx | 将哈希表 key 中的域 field 的值设置为 value ,当且仅当域 field 不存在 . |

5.6.3数据结构

  • Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable

    6.1Units单位

  • 配置大小单位,开头定义了一些基本的度量单位,只支持bytes,不支持bit

  • 大小写不敏感

    6.2includes

  • 配置集群的时候可以把共同的配置文件提取出来

    6.3网络配置相关的

  • bind

    • 设置谁可以访问redis
    • 如果开启了protected-mode,那么在没有设定bind ip且没有设密码的情况下,Redis只允许接受本机的响应
  • protected-mode
    • 本地访问保护
  • Port
    • 端口号
  • tcp-backlog
    • backlog是一个连接队列
    • backlog=为完成三次握手+已完成三次握手的
  • timeout
    • 一个空闲的客户端在什么时间进行关闭,0代表永不关闭
  • tcp-keepalive

    • 对访问客户端的一种心跳检测,每个n秒检测一次。单位为秒,如果设置为0,则不会进行Keepalive检测,建议设置成60

      6.4General

  • daemonize

    • 是否为守护进程设为yes
  • pidfile
    • 存放pid文件的位置,每个实例会产生不同的pid
  • loglevel
    • 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为notice
    • 四个级别根据使用阶段来选择,生产环境选择notice 或者warning
  • logfile
    • 日志文件的名称
  • databases

    • 设置多少个数据库

      6.5SECURITY安全

  • 设置密码

    6.6limits

  • maxclients

    • 设置最多同事连接多少客户端
    • 默认情况下为10000个客户端
    • 如果达到了此限制,redis则会拒绝新的连接请求,并且向这些连接请求方发出“max number of clients reached”以作回应
  • maxmemory
    • 设置Redis可以用的内存
    • 必须设置,一旦内存满了,redis试图移除内部的数据,移除规则可以通过maxmemory-policy来指定
    • 如果redis无法根据移除规则来移除内存中的数据,或者设置了“不允许移除”,那么redis则会针对那些需要申请内存的指令返回错误信息,比如SET、LPUSH等
    • 但是对于无内存申请的指令,仍然会正常响应,比如GET等。如果你的redis是主redis(说明你的redis有从redis),那么在设置内存使用上限时,需要在系统中留出一些内存空间给同步队列缓存,只有在你设置的是“不移除”的情况下,才不用考虑这个因素
  • maxmemory-policy
    • volatile-lru:使用LRU算法移除key,只对设置了过期时间的键;(最近最少使用)
    • allkeys-lru:在所有集合key中,使用LRU算法移除key
    • volatile-random:在过期集合中移除随机的key,只对设置了过期时间的键
    • allkeys-random:在所有集合key中,移除随机的key
    • volatile-ttl:移除那些TTL值最小的key,即那些最近要过期的key
    • noeviction:不进行移除。针对写操作,只是返回错误信息
  • maxmemory-samples
    • 设置样本数量,LRU算法和最小TTL算法都并非是精确的算法,而是估算值,所以你可以设置样本的大小,redis默认会检查这么多个key并选择其中LRU的那个
    • 一般设置3到7的数字,数值越小样本越不准确,但性能消耗越小。

      6.Redis的jedis测试

      6.1.jedis需要的包

      ```xml redis.clients jedis 3.2.0
  1. <a name="Kw8cX"></a>
  2. ### 6.2注意事项
  3. 1. 禁用防火墙
  4. 1. systemctl stop firewalld.service
  5. 1. systemctl disable firewalled.service
  6. 2. 开启权限访问
  7. 1. redis.conf注释掉bind 127.0.0.1
  8. 1. protected-mode no
  9. <a name="UTMci"></a>
  10. ### 6.3jedis的常规操作
  11. 1. 创建动态工程
  12. ```java
  13. public class redis {
  14. public static void main(String[] args) {
  15. Jedis jedis = new Jedis("hadoop102", 6379);
  16. String ping = jedis.ping();
  17. System.out.println("ping = " + ping);
  18. }
  19. }

任务