博客已迁移到CSDN《https://blog.csdn.net/qq_33375499

在学习redis之前,我们首先需要了解一下NoSQL(非关系数据库)。非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定。

为什么需要NoSQL?

  (1) High performance - 高并发读写

  (2) Huge Storage - 海量数据的高效率存储和访问

  (3) High Scalability && Hig Availability - 高可扩展性和高可用性

NoSQL数据库的四大分类:

  (1) 键值(Key - Value)存储

  (2) 列存储

  (3) 文档数据库

  (4) 图形数据库

NoSQL的特点:

  (1) 易扩展:数据库种类多,非关系

  (2) 灵活的数据模型:无需对存储的数据模型进行建立

  (3) 大数据量,高性能:具有高读写性能

  (4) 高可用:可以集成于很多框架

  REmote DIctionary Server(Redis)是一个由Salvatore Sanfillippo写的key-value存储系统,遵循BSD协议、支持网络、可基于内存亦可持久化的日志型、key-value数据库,通常称它为数据结构服务器,因为值(value)可以是String、Hash、List、Set、Sorted Set等类型。

Redis的应用场景:

  (1) 缓存:数据的查询

  (2) 任务队列:秒杀,抢购

  (3) 网站访问统计

  (4) 数据过期处理:精确到毫秒

  (5) 应用排行榜

  (6) 分布式集群架构中的session分离

Redis与其他 key-value缓存产品有以下三个特点:

  1. Redis支持数据的持久化,可以将内存中的数据保存在磁盘中(在写入的时候可能会存在数据丢失),重启的时候可以再次加载进行使用。
  2. Redis不仅仅支持简单的key-value类型的数据,同时还提供list、set、sorted set、hash等数据结构的存储。
  3. Redis支持数据的备份,即master-slave模式的数据备份。

Redis连接

  Jedis是Redis官方推荐的Java连接开发工具。

// 1.设置IP地址和端口
Jedis jedis = new Jedis("localhost", 6379);
// 2.保存数据
jedis.set("name", "张三");
String val = jedis.get("name");
System.out.println(val);
// 3.关闭资源
jedis.close();

  基于连接池的连接

// 获得连接池的配置对象
JedisPoolConfig config = new JedisPoolConfig();
// 设置最大连接数
config.setMaxTotal(30);
// 设置最大的空闲连接数
config.setMaxIdle(10);
// 设置最大等待时间
config.setMaxWaitMillis(1000); try(
// 获得连接池
JedisPool jedisPool = new JedisPool(config, "localhost", 6379);
Jedis jedis = jedisPool.getResource();
) {
jedis.set("name1","00001");
String val = jedis.get("name1");
System.out.println(val);
}catch (Exception e){
e.printStackTrace();
}

Redis 优势

  1. 性能极高:Redis最高读取速度是110000次/s,写入速度是81000次/s。
  2. 丰富的数据类型进行存储。
  3. 操作原子性:Redis的所有操作都是原子性的,并且支持多个操作通过MULTI和EXEC指令包裹起来后的原子性。

有关redis的下载安装请查考 https://www.runoob.com/redis/redis-install.html

Window

  1. 运行服务端:打开一个 cmd 窗口 使用 cd 命令切换目录到 redis安装目录(如:D:\redis) 运行:redis-server.exe redis.windows.conf  启动服务端,也可以直接点击 redis.window.conf 进行运行。
  2. 访问服务端:另启一个cmd窗口(原来打开的cmd窗口不要关闭,不然无法访问服务端),使用cd命令切换到redis的安装目录下运行: redis-cli.exe -h 127.0.0.1 -p 6379

Redis配置

  Redis的配置文件位于Redis安装目录下文件名为redis.windows.conf中,也可以通过config命令查看或设置配置项。

Redis CONFIG 命令格式如下:

  redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME

  可以使用 * 号获取所有配置项:config get *

Redis 存储数据类型

  1. 字符串(字符串):string是redis最基本的类型,是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。一个键最大存储为512MB。

    (1) 存:set key1 value1

    (2) 取:get key1

    (3) 获取并设置:getSet key1 value2

    (4) 删除:del key1

    (5) 递增:incr key1    (将key1的值递增一次,如果不存在这个值,则先将这个值设置为0,然后递增1;如果不能转为整形,则返回错误信息。)

    (6) 递减:decr key1   (将key1的值递减一次,如果不存在这个值,则先将这个值设置为0,然后递减1;如果不能转为整形,则返回错误信息。)

    (7) 递增值:incrby  key1  val1    (将key1的值递增val1,如果不存在这个值,则先将这个值设置为0,然后递增val1;如果不能转为整形,则返回错误信息。)

    (8) 递减值:decrby  key1  val1   (将key1的值递减val1,如果不存在这个值,则先将这个值设置为0,然后递减val1;如果不能转为整形,则返回错误信息。)

    (9) 拼凑字符串:append  key1  val1 (字符串拼接,将redis中key1的值后面拼接一个val1字符串,返回拼接后字符串的长度,如果不存在,则进行创建设置为val1)

  2.哈希(hash):hash是一个键值对集合,是string类型的field和value的映射表,hash特别适合用于存储对象。

    (1) 存:存单个键值对 - hset key1 field1 value1 存多个键值对 - hmset key1 field1 value1 field2 value2 ... ...

    (2) 取:取单个键值 - hget key1 field1 取多个键值 - hmget key1 field1 field2 ... ... 取key1对象的全部键值 - hgetall key1

    (3) 删除:删除多个键值对 - hdel key1 field1 field2 ... 删除全部 del key1

  3.列表(List):list是一个简单字符串列表,按照插入顺序排序。

    (1) 两端添加:左侧 - lpush list1 value1 右侧 - rpush list1 value2

    (2) 查看:lrange list1 start_number end_number (num可以为负数,负数表示从尾部开始的索引位置)

    (3) 两端弹出:左侧 - lpop list1 右侧 - rpop list1

    (4) 长度:llen list1

    (5) 插入:lpushx list1 value1 (仅当list1存在时才在左侧插入) rpushx list1 value1 (仅当key1存在时才在右侧插入)

    (6) 删除指定值得元素:lrem list1 count_number value1 (删除list1中count_number个值为value1的元素,如果count_number > 0,表示从左侧开始多少个;如果 count_number < 0,表示从右侧开始多少个;如果count_number = 0,表示全是全部值为value1的元素。)

    (7) 在指定位置添加元素:在指定位置插入元素 - lset list1 index1 value1 在指定元素前插入元素 - linsert list1 before value1 value2 在指定元素后插入元素 - linsert list1 after value1 value2

    (8) 将list1中的尾部元素取出并添加到list2的头部:rpoplpush list1 list2

  4.集合(Set):set是string类型的无序集合,set集合中不允许出现重复的元素。添加一个string元素到key对应的set集合中,成功返回1,如果元素已经在集合中返回0,如果key对应的set不存在则返回错误。

    (1) 存:sadd set1 value1 value2 ...

    (2) 查看:smembers set1

    (3) 删除:srem set1 value1 value2 ...

    (4) 判断在集合中元素是否存在:sismember myset value1   (如果存在,返回1;不存在返回0)

    (5) 差集:sdiff set1 set2 (返回在set1中存在的,在set2不存在的元素)

    (6) 交集:sinter set1 set2 (返回同时set1、set2中都存在的元素)

    (7) 并集:sunion set1 set2 (返回set1、set2的集合,会自动去重)

    (8) 获取元素个数:scard set1

    (9) 随机返回一个元素:srandmember set1

    (10) 将两个set(set1、set2)的差集存放在另一个集合(set3)中:sdiffstore set1 set2 set3

    (11) 将两个set(set1、set2)的交集存放在另一个集合(set3)中:sinterstore set1 set2 set3

    (12) 将两个set(set1、set2)的并集存放在另一个集合(set3)中:sunionstore set1 set2 set3

  5.有序集合zset(Sorted set):zset和set一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。Redis正是通过分数来为集合中的成员进行排序。

    (1) 添加元素:zadd sort1 score1 value1 score2 value2 ... ... (返回添加元素的个数)

    (2) 获取元素:获取元素的分数 - zscore sort1 value1 获取元素的个数 - zcard sort1

    (3) 删除元素:zrem sort1 value1 value2 ... 范围删除 - zremrangebyrank sort1 num1 num2 按分数范围删除 - zremrangebyscore sort1 score1 score2

    (4) 范围查找:zrange sort num1 num2 显示分数 - zrange sort1 num1 num2 withscores (分数由小到大) zreverange sort1 num1 num2 withscores (分数由大到小) 按分数由小到大查找 - zrangebyscore sort1 num1 num2 按分数由小到大查找,并显示分数 - zrangebyscore sort1 num1 num2 withscores    分页查找 - zrangebyscore sort1 num1 num2 limit start_num stop_num

    (5) 分数加减:zscore sort1 score1 value1

    (6) 统计分数范围的元素个数:zcount sort1 score1 score2

Redis的keys的通用操作

    (1) 获取所有key:keys *

    (2) 获取字符开头的keys:keys prefix?

    (3) 删除key:del key1 key2 ...

    (4) 判断是否存在:exists key1  (返回1-存在,0-不存在)

    (5) 重命名:rename key1 new_key1

    (6) 设置过期时间(单位:s):expire key1 num

    (7) 所剩时间:ttl key1 (无设置过期时间,返回-1)

    (8) 获取类型:type key1

Redis的特性:

  1. 多数据库:一个redis可以包含多个数据库,客户端可以指定连接某个redis实例的数据库,一个redis最多可以提供16个数据库,下标为0~15,客户端默认连接下标为0的数据库。(index_表示下标,数值为0~15)

    (1) 指定连接那个数据库:select index_

    (2) 将key1移动到另一个数据库:move key1 index_

  2.Redis事务:事务中,所有命令都会串行执行,事务执行期间,redis不会为其它的客户端提供服务,从而保证命令原子化执行。 Redis命令在事务中可能会执行失败,但是Redis事务不会回滚,而是继续会执行余下的命令。这里和关系型数据库有点区别,因为关系型数据在这种情况下都是会回滚的;在multi之后的事务语句,都会将事务放进队列,这是会检查语法等,也就是在事务执行期间语法都是没有问题的,命令出错的话就是程序有问题,redis不会因为一条错误而设计成回滚,降低存储效率来弥补程序本身的错误。redis使用的是串行化隔离机制,串行化机制规定事务的提交必须有序的,如果一个事务打开了,未提交事务或者回滚事务,另外开启一个事务的话,必须等待前一个事务处理完数据,才能处理数据,否则后面这个事务不能处理数据,所以后提交的数据时会出现锁为获取或者未获取锁无法提交等等错误。

    (1) 开启事务:multi

    (2) 提交事务:exec

    (3) 回滚事务:discard

Redis的持久化

  redis的高性能是因为所有的数据都是保存在内存中。为了保存数据不被丢失,就需要对数据进行持久化。

  1. RDB方式:默认支持、不需要配置,在指定的时间间隔内,将内存中的数据集快照写入磁盘。
  2. AOF方式:以日志的方式,记录服务器所处理的每一个操作,在redis启动的时候会读取该文件,来重新构建数据库,保证启动后数据库中的数据是完整的。
  3. 不持久化:通过配置禁用redis持久化的功能,这样redis只是一个缓存的工具
  4. 可以RDE、AOF结合使用。

RDB:

优势:

  1、redis的数据库只包含一个文件,对于文件备份来说很完美

  2、备份:如每个小时归档一次最近24小时的数据,同时每天归档一次最近30天的数据,那么当系统出现灾难性故障的时候,可以恢复(对于灾难恢复来说RDB是非常好的选择,可以将一个单独的文件压缩后转移到其他的存储介质上)

  3、性能最大化:对于redis进程而言,在开始持久化的时候,它唯一需要做的是分叉处一些子进程,之后的由子进程完成这些持久化的工作,极大的避免服务器进程执行IO操作

  4、与AOF相比优势:启动效率更高

劣势:

  1、想保证数据的高可用性(最大限度避免数据的丢失),那RDB不是一个很好的选择(如果系统在定时持久化之前发生故障,那么数据还没来得及往磁盘上写,数据就已经丢失了)

  2、子进程协助完成持久化,因此当数据集很大的时候,可能会导致服务器停止几百毫秒

配置:

  redis 默认使用RDB 方式持久化,配置文件为redis.conf(window下为redis.windows-service.conf)

  1. save 900 1:表示每900秒至少一个key发生变化,就保存一次
  2. save 300 10:表示每300秒至少有10个key发生变化,就保存一次
  3. save 60 10000:表示每60秒至少有10000个key发生变化,就保存一次
  4. dbfilename dump.rdb:表示存储数据的文件名
  5. dir ./   :表示数据的存储路径

AOF

优势:

  1、更高的数据安全性。同步策略:每秒同步,每修改同步、不同步。每秒同步:异步完成,效率高,系统出现宕机,那么这一秒中修改的数据就会丢失;每修改同步:可以看作同步持久化,么一次发生数据的变化,都会立即写到磁盘当中,效率低,但是最安全

  2、对日志文件的写入操作,采用的是追加模式(append),因此在写入过程中,即使出现了宕机的情况,也不会破坏日志文件中已经存在的内容。如果本次写入进行到一半就出现宕机,那么这种方式也不必担心,redis在下一次启动之前,可以通过redis-check-aof这个工具,帮助我们解决数据一致性的问题

  3、如果日志过大,redis可以自动启动重写机制,redis以append模式不断的将修改的数据写入到老的磁盘文件当中,同时redis会创建一个新的文件,用于记录此期间产生的哪些修改命令被执行。因此,在进行重写切换的时候,可以更好的去保证数据的安全性

  4、AOF包含一个格式清晰易于理解的日志文件用于记录所有的修改操作,也可以通过这个文件完成数据的重建

劣势

  1、对于相同数量的数据集而言,AOF的文件要比RDB的文件大一些

  2、根据同步策略的不同,AOF在效率上往往低于RDB

配置:

  redis 配置文件为redis.conf(window下为redis.windows-service.conf)

  1. 打开 AOF:appenddonly yes
  2. 日志文件名称:appendfilename “appendonly.aof”
  3. 设置同步策略:每秒同步 - appendfsync always; 每修改同步 - appendfsync everysec; 不同步 - appendfsync no;

AOF下的Redis持久化:启动后,插入一些数据后,通过flushall清空数据库,然后关闭redis,重新启动redis之前,修改日志文件配置文件,将最后一行的flushAll删除,并保存,然后重启redis

java - redis学习的更多相关文章

  1. Redis 教程 Java工程师学习知识点

    1. Redis简介及安装 1.1 Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下 ...

  2. Redis学习十一:Redis的Java客户端Jedis

    一.安装JDK tar -zxvf jdk-7u67-linux-i586.tar.gz vi /etc/profile 重启一次Centos 编码验证 二.安装eclipse 三.Jedis所需要的 ...

  3. Java工程师学习指南第7部分:重新学习MySQL与Redis

    本文整理了微信公众号[Java技术江湖]发表和转载过的Mysql和Redis相关优质文章,想看到更多Java技术文章,就赶紧关注本公众号吧吧. 大白话说说mysql 面试官:给我说说你平时是如何优化M ...

  4. Java使用Redis学习笔记

    如果我们使用Java操作Redis, 需要确保已经安装了 redis 服务及 Java redis 驱动. Maven项目可以直接在pom.xml中加入jedis包驱动: <dependency ...

  5. Redis学习总结(2)——Java使用Redis

    安装 开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java. Java的安装配置可以参考我们的 Java ...

  6. Redis学习笔记7--Redis管道(pipeline)

    redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常会阻塞并等待redis ...

  7. 分布式缓存技术redis学习系列(五)——redis实战(redis与spring整合,分布式锁实现)

    本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...

  8. redis学习大全

     http://blog.csdn.net/menergy/article/details/17577985 http://blog.sina.com.cn/s/blog_64008ed70102uy ...

  9. Redis学习——Redis持久化之AOF备份方式保存数据

    新技术的出现一定是在老技术的基础之上,并且完善了老技术的某一些不足的地方,新技术和老技术就如同JAVA中的继承关系.子类(新技术)比父类(老技术)更加的强大! 在前面介绍了Redis学习--Redis ...

随机推荐

  1. linux系列(二十二):tar命令

    1.命令格式 tar[必要参数][选择参数][文件] 2.命令功能 用来压缩和解压文件.tar本身不具有压缩功能.他是调用压缩功能实现的 3.命令参数 必要参数: -A 新增压缩文件到已存在的压缩 - ...

  2. Springboot @ConditionalOnProperty注解

    最近看了一段代码其中用到了@ConditionalOnProperty注解,直接没有了解过这个注解,今天看到了顺便了解一下 具体代码如下 @Configuration public class Web ...

  3. K Simple question (第十届山东理工大学ACM网络编程擂台赛 正式赛)

    题解:素数筛+唯一分解定理 可以把素数筛那部分放到while之外,减小时间复杂度. #include <stdio.h> #include <stdlib.h> #includ ...

  4. ROS参数服务器(Parameter Server)

    操作演示,对参数服务器的理解:点击打开链接 rosparam使得我们能够存储并操作ROS 参数服务器(Parameter Server)上的数据.参数服务器能够存储整型.浮点.布尔.字符串.字典和列表 ...

  5. 前端武器库系列之html后台管理页面布局

    设计网页,让网页好看:网上找模板 搜 HTML模板 BootStrap 一.页面布局之主站页面 主站布局一般不占满页面,分为菜单栏.主页面.底部 上中下三部分.伪代码如下: <div class ...

  6. P5346 【XR-1】柯南家族(后缀数组+主席树)

    题目 P5346 [XR-1]柯南家族 做法 聪明性是具有传递性的,且排列是固定的 那么先预处理出每个点的名次,用主席树维护\(k\)大值 一眼平衡树,遍历的同时插入\(O(log^2n)\),总时间 ...

  7. Java基本的线程操作(附代码)

    啦啦啦啦,从头整理一遍java并发的内容.开始是基本的线程操作 线程状态切换: 新建线程: @Test public void newTread(){ Thread t1 = new Thread(n ...

  8. js对元素判断

    $("input[type='text']").attr("readonly","readonly"); $("textarea& ...

  9. oracle 导入导出功能

    关于expdp和impdp 使用EXPDP和IMPDP时应该注意的事项: EXP和IMP是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用. - EXPDP和IMPDP是服务端的工具程序,他 ...

  10. python matplotlib(数据可视化)

    吐槽 网上搜了不少matplotlib安装方法(不信,你可以试试.) 我只能说,除了太繁琐,就是没什么用! 如果你是python3.6.5版本 我给你最最最正确的建议: 直接打开cmd,找到pip用命 ...