文章目录
  1. 1. NoSQL概述
  2. 2. Redis概述
  3. 3. Redis的下载与安装
  4. 4. Jedis的使用
  5. 5. Redis的数据结构
  6. 6. Redis中keys的通用操作
  7. 7. Redis特性
  8. 8. Redis持久化

NoSQL概述

  • 什么是NoSQL?
    • NoSQL == Not Only sql && NoSQL != No sql
    • 也就是所谓的非关系型数据库啦
  • 为啥需要NoSQL?
    • 因为!随着互联网的发展,非关系型数据库比关系型数据库更能满足下列需求 :
      • 高并发读写需求
      • 海量数据的高效率存储与访问
      • 高可扩展性与高可用性
    • 详见 –> 关不关系型数据库.md
  • NoSQL数据库的四大分类 :
    • 键值存储
      • 优 :快速查询
      • 劣 :存储的数据缺失结构化
    • 列存储
      • 优 :查询速度快、可扩展性强
      • 劣 :功能相对局限
    • 文档数据库
      • MongoDB
      • 优 :对数据结构要求不太严格
      • 劣 :查询性能一般、缺少统一语法
    • 图形数据库
      • 优 :利用图结构的算法
      • 劣 :需要对整个图做计算才能得出结果
    • 最后放张对比图 :
  • NoSQL的特点 :
    • 易扩展(因为摒弃了数据之间粘连)
    • 数据模型灵活(比如说不用提前建好字段)
    • 大量数据、高性能
    • 高可用

Redis概述

  • Redis是什么?
    • Redis是一种
    • 高性能
    • 键值对
    • 数据库
  • Redis支持的键值数据类型有哪些?
    • 字符串类型(String)
    • 散列类型(Hash)
    • 列表类型(List)
    • 集合类型(Set)
      • 相当于一个不能出现重复元素的list
    • 有序集合类型(Sorted Set / zset)
      • 相当于一个给每个元素打上分的set
  • Redis的应用场景
    • 缓存
    • 任务队列
    • 网站访问统计
    • 数据过期处理
    • 应用排行榜
    • 分布式集群架构中的session分离

Redis的下载与安装

  • 首先让我们来看一下怎么安装
    • 注意是在Linux环境下嗷 然后就这样跟着做就好啦 φ(>ω<*)
    • 安装
  • 然后要怎么启动呢?
    • 进入到我们指定的目录下的redis目录里面
    • 会发现有一个bin文件(用来存放可执行命令),进入它
    • 回到家目录,进入解压后的文件,找到redis.conf
    • 将它拷贝到安装目录下 :
    • 然后就配置成功啦 让我们启动一下 :
  • 但是!这样子前端启动(好像是这么叫?)的话,就不能做其他操作了!超级不方便,所以我们最好采用另一种方式 :后端启动(好像
    • 进入redis.conf,找到这一行,然后把原本的no改为yes
    • 然后就完成啦!再启动一下(注意要让它在前端启动的基础上加载配置文件,也就是后面跟的那点):
    • 最后确认一下,就可以看到它已经成功在后台启动啦 :
  • 那么问题来了,我们要怎么停止它呢?
    • 像这样,进入bin目录下的客户端(redis-cli),shutdown它,再检查一下,就会发现这个进程已经不存在啦

Jedis的使用

  • 首先确认一下它是能用的 :
    • 后台启动redis后,进入bin下的客户端,给它发个ping的消息;客户端回个PONG,就说明连接正常,可以使用啦 φ(>ω<*)
  • (照搬)个小demo试验一下

    • 比如说这样写 :
      1
      2
      3
      4
      5
      6
      7
      8
      9
      // 设置IP地址和端口号
      Jedis jedis = new Jedis("192.168.43.163",6379);
      // 保存数据
      jedis.set("name","kangna");
      // 获取数据
      String valueOfName = jedis.get("name");
      System.out.println( "valueOfName = " + valueOfName);
      // 释放资源
      jedis.close();
  • 然后试着用idea连一下:

    • 首先vim /etc/sysconfig/iptables 设置一下防火墙
    • 进来之后找到上面那行,yy(复制) + p(粘贴),改一下端口号
    • 然后重启我们的防火墙
    • 但是还是报错了!为什么呢为什么呢?
  • 好像是说redis默认只能localhost登录,所以需要开启远程登录 :
    • 将proteced-mode(保护模式)设置为no
    • 然后注释掉 bind 127.0.0.1 这行
    • 最后重启redis,然后回idea运行一下,就可以看见我们的老婆了!
  • 那那那能不能用连接池呢?当然是可以的!
    • 就直接这样子 :
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      // 获取连接池配置对象
      JedisPoolConfig poolConfig = new JedisPoolConfig();
      // 然后设置一下,比如最大连接数、最大空闲连接数什么的
      poolConfig.setMaxTotal(20);
      poolConfig.setMaxIdle(10);

      // 获取连接池
      JedisPool jedisPool = new JedisPool(poolConfig,"192.168.43.163",6379);

      // 获取Jedis对象
      Jedis jedis = null;
      try {
      // 通过连接池获取连接
      jedis = jedisPool.getResource();

      // 然后就是各种操作啦

      } catch (Exception e) {
      e.printStackTrace();
      } finally {
      // 最后关闭资源
      if(jedis != null) {
      jedis.close();
      }
      if(jedisPool != null) {
      jedisPool.close();
      }
      }

Redis的数据结构

  • 字符串(String)常用命令 :
    • set [key] [value]
      • 设置指定key的值
    • get [key]
      • 获取指定key的值
    • getset [key] [value]
      • 将给定key的值设为value,并返回之前的值
      • 注 :用set直接改值的话,返回的是OK
    • setnx [key] [value]
      • 只在key不存在的时候设置key的值
    • getrange [key] [start] [end]
      • 返回字符串值中的子字符串
    • mget [key1] [key2] […]
      • 一次获取多个key的值(不存在的话就返回nil(相当于null)嘛)
    • mset [key1] [value1] [key2] [value2] […] […]
      • 同时设置多个键值对
    • del [key] / del [key1] [key2] […]
      • 删除单个或多个键值对,直接在后面跟要删的key就好啦
      • 回注 :del感觉超级强大好像每个类型的都能删诶..
    • incr/decr [key]
      • 将key中储存的数字值+1
    • incrby/decrby [key] [increment]
      • 将key中所储存的数字值加上给定值
    • incrbyfloat [key] [increment]
      • 将key中所储存的数字值加上给定浮点数值
      • 注 :浮点数要减的话,就直接加一个负的,比如这样 :
    • append [key] [append-value]
      • 在key中所储存的字符串末尾追加一个新字符串
      • 注 :最好用双引号括起来,不然会连在一起的!
  • 哈希(hash)常用命令 :
    • hset [key] [field] [value]
      • 设置指定key中指定field(属性)的值
    • hmset [key] [field1] [value1] [field2] [value2] […]
      • 一次为指定key中多个属性设置对应的值
    • hget [key] [field]
      • 获取指定key中某一属性的值
    • hmget [key] [filed1] [field2] […]
      • 获取指定key中多个属性的值
    • hgetall [key]
      • 获取指定key中各个属性即其对应值
    • hdel [key] [field1] [field2] […]
      • 删除指定key中一个或多个属性

    • del [key1] [key2] […]
      • 直接删除指定的一个或多个key

    • hincrby [key] [field] [increment]
      • 将key中存储的数字加上给定值
    • hexists [key] [field]
      • 判断指定key中某个属性是否存在
    • hlen [key]
      • 获取指定key中的全部属性的数量
    • hkeys [key]
      • 获取指定key中的各个属性
    • hvals [key]
      • 获取指定key中各个属性的值
  • 字符串列表(list)常用命令 :
    • lpush/rpush [list] [arg1] [arg2] […]
      • 从左边/右边向链表中添加元素
      • 注 :是从左边添加,不是从左向右添加;从右边同理
    • lrange [list] [start] [end]
      • 查看列表中从start到end的元素
      • 注 :如果想查看所有元素,用0到-1就可以了
    • lpop/rpop [list]
      • 弹出该链表左边/右边的第一个元素(弹出了就没有了)
    • llen [list]
      • 返回指定list中的元素个数
    • lpushx/rpushx [list] [arg]
      • 向该链表左端/右端插入指定元素
    • lrem [list] 0 [arg]
      • 删除该链表中的所有指定元素
    • lset [list] [index] [arg]
      • 将list中某一角标的值改写为指定值
    • linsert [list] before/after [arg] [inserted-arg]
      • 在list中的第一个指定元素之前/后插入某一元素
    • rpoplpush [list1] [list2]
      • 将list1的右边元素弹出,并压入到list2的左边
  • 字符串集合(set)常用命令 :
    • sadd [set] [arg1] [arg2] […]
      • 向集合中添加元素
      • 注 :重复的元素是加不进去的!比如这样 :
    • srem [set] [arg1] [arg2] […]
      • 删除集合中的一个或多个元素
    • smembers [set]
      • 查看该集合中的全部元素
    • sismember [set] [arg]
      • 判断某个元素是否在该集合中
    • sdiff [set1] [set2]
      • 返回给定集合之间的差集(与给定顺序相关)
      • 注 :准确来说是返回”在前一个set中存在,但在后一个set中不存在”的元素 :
    • sinter [set1] [set2]
      • 返回给定集合之间的交集(与给定顺序无关)
    • sunion [set1] [set2]
      • 返回给定集合之间的并集(与给定顺序稍微有关)
    • sdiffstore/sinterstore/sunionstore [newSet] [set1] [set2]
      • 将给定集合之间的差集/交集/并集存入一个新的集合
    • scard [set]
      • 返回给定集合中的元素个数
    • srandmember [set]
      • 随机返回一个给定集合中的元素
  • 有序字符串集合(sorted set)常用命令 :
    • zadd [zset] [score1] [arg1] [score2] [arg2] […]
      • 向指定集合中添加元素
      • 注 :如果添加已存在的元素,会直接覆盖,并且返回0
    • zscore [zset] [arg]
      • 返回指定集合中某个元素对应的分数
    • zcard [zset]
      • 返回指定集合中的元素个数
    • zrem [zset] [arg1] [arg2] […]
      • 移除指定集合中的一个或多个元素
    • zrange [zset] [start] [end] (withscores)
      • 按分数排序(默认从小到大)返回指定集合中从start到end的元素
      • 注 :如果用zrevrange的话就是从大到小排序
    • zremrangebyrank [zset] [start] [end]
      • 删除指定集合中按分数排序后从start到end的元素
    • zremrangebyscore [zset] [min] [max]
      • 删除指定集合中分数在min到max区间内的元素
    • zrangebyscore [zset] [min] [max] (withscores) (limit [offset] [count])
      • 返回指定集合中,分数在min到max区间内的元素
      • 注 :limit表示从offset开始,往后取count个元素(类似于sql语句里面分页的那个limit)
    • zincrby [zset] [increment] [arg]
      • 为集合中的指定元素增减分数
    • zcount [zset] [min] [max]
      • 返回该集合中指定区间内的元素个数

Redis中keys的通用操作

  • 常用命令如下 :
    • keys [通配符]
      • 返回符合条件的所有keys
    • del [key1] [key2] […]
      • 删除指定的一个或多个key
    • rename [key-name] [key-newName]
      • 重命名这个key
    • type [key]
      • 得到这个key的类型

Redis特性

  • 多数据库
  • 事务

Redis持久化

  • 持久化 :
    • 将数据从内存同步到硬盘上的过程
  • RDB(默认) :
    • 每经过指定时间就写入一次
  • AOF :
    • 将执行过的写指令记录下来,在数据恢复时按照从前到后的顺序再将指令都执行一遍
  • 为什么写的这么敷衍 :
    • 因为仙女学不动了(望天
文章目录
  1. 1. NoSQL概述
  2. 2. Redis概述
  3. 3. Redis的下载与安装
  4. 4. Jedis的使用
  5. 5. Redis的数据结构
  6. 6. Redis中keys的通用操作
  7. 7. Redis特性
  8. 8. Redis持久化