精华内容
下载资源
问答
  • Java面试——Redis系列总结

    万次阅读 多人点赞 2021-10-11 12:53:33
    4.Redis都有哪些数据类型? 5.什么是Redis持久化?Redis 的持久化有哪些实现方式? 6.什么是Redis事务? 7.谈谈你对Redis集群方案——哨兵模式 的理解 8.Redis主从复制的原理是什么? 9.Redis如何实现分布式锁...

    文章目录:

    1.什么是Redis?

    2.为什么要用 Redis / 为什么要用缓存?

    3.Redis为什么这么快?

    4.Redis都有哪些数据类型?

    5.什么是Redis持久化?Redis 的持久化有哪些实现方式?

    6.什么是Redis事务?

    7.谈谈你对Redis集群方案——哨兵模式 的理解

    8.Redis主从复制的原理是什么?

    9.Redis如何实现分布式锁?

    10.Redis中的缓存穿透、缓存击穿、缓存雪崩是什么?


    1.什么是Redis?

    Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。

    Redis 可以存储键和五种不同类型的值之间的映射。键的类型只能为字符串,值支持五种数据类型:字符串、列表、散列表、集合、有序集合。

    与传统数据库不同的是 Redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。另外,Redis 也经常用来做分布式锁。除此之外,Redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案。

    2.为什么要用 Redis / 为什么要用缓存?

    主要从“高性能”和“高并发”这两点来看待这个问题。

    高性能

    假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。再将该用户访问的数据存在缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!

    高并发

    直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。

    3.Redis为什么这么快?

    1. 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于 HashMap,HashMap 的优势就是查找和操作的时间复杂度都是O(1);
    2. 数据结构简单,对数据操作也简单,Redis 中的数据结构是专门进行设计的;
    3. 采用单线程,避免了不必要的上下文切换和竞争,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
    4. 使用 I/O 多路复用模型,非阻塞 IO;

    4.Redis都有哪些数据类型?

    Redis主要有5种数据类型,包括String,List,Hash,Set,ZSet。

    数据类型可以存储的值操作应用场景
    String字符串、整数或者浮点数对整个字符串或者字符串的其中一部分执行操作对整数和浮点数执行自增或者自减操作做简单的键值对缓存
    List列表从两端压入或者弹出元素对单个或者多个元素进行修剪,只保留一个范围内的元素存储一些列表型的数据结构,类似粉丝列表、文章的评论列表之类的数据
    Hash包含键值对的无序散列表添加、获取、移除单个键值对获取所有键值对 检查某个键是否存在结构化的数据,比如一个对象
    Set无序集合添加、获取、移除单个元素检查一个元素是否存在于集合中 计算交集、并集、差集从集合里面随机获取元素交集、并集、差集的操作,比如交集,可以把两个人的粉丝列表整一个交集
    ZSet有序集合添加、获取、删除元素根据分值范围或者成员来获取元素 计算一个键的排名去重但可以排序,如获取排名前几名的用户

    • String应用场景:

                     商品编号、订单号采用incr命令生成;
                     是否喜欢的文章(点赞数incr)

    • Hash应用场景:

                     购物车(新增商品hset、增加商品数量hincrby
                                   商品总数hlen、全部选中hgetall)

    • List应用场景:

                     微信订阅公众号(订阅lpush、查看订阅号文章lrange)

    • Set应用场景:

                     抽奖活动(参与sadd、显示参与人数scard、
                                       随机抽取srandmember、spop)
                     文章点赞(新增点赞sadd、取消点赞srem、
                                       展现所有点赞用户smember、点赞数统计scard)
                     社交平台(两个人的共同关注sinter、
                                       QQ可能认识的人求差集sdiff)

    • Zset应用场景:

                     根据商品销售对商品进行排序(zadd、zincrby、zrange)
                     抖音热搜排行榜

    5.什么是Redis持久化?Redis 的持久化有哪些实现方式?

    持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。

    Redis 提供两种持久化机制 RDB(默认) 和 AOF 机制:


    RDB持久化:是Redis DataBase缩写,快照

    RDB是Redis默认的持久化方式。在指定的时间间隔内将内存中的数据集快照写入磁盘, 也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。

    如何触发RDB快照;保持策略。

    配置文件中默认的快照配置,这三行save代码的意思是:

    在3600秒(一个小时)内,如果有1个数据发生改变,则进行持久化。

    在30秒内,如果有10个数据发生改变,则进行持久化。(原先是 save 300 100),我为了后面测试RDB,这里进行了修改。

    在60秒内,如果有10000个数据发生改变,则进行持久化。

    工作流程

    1. redis根据配置尝试去生成rdb快照文件

    2. redis主进程fork一个子进程出来

    3. 子进程尝试将内存中的数据dump到临时的rdb快照文件中

    4. 完成rdb快照文件的生成之后,覆盖旧的快照文件

    优点

    1. 只有一个文件 dump.rdb,方便持久化,容灾性好。

    2. 性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,保证了 redis 的高性能

    3. 数据集大时,比 AOF 的启动效率更高。

    缺点

    1. 数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。


    AOF持久化:Append Only File缩写

    将Redis执行的每条写命令记录到单独的aof日志文件中,当重启Redis服务时,会从持久化的日志文件中恢复数据。

    当两种方式同时开启时,数据恢复时,Redis会优先选择AOF恢复。

    图片

    配置

    # 表示是否开启AOF持久化(默认no,关闭)
    appendonly yes 

    工作流程

    1. 所有的写入命令会追加到AOF缓冲区中。

    2. AOF缓冲区根据对应的策略向硬盘做同步操作。

    3. 随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩的目的。

    4. 当Redis服务器重启时,可以加载AOF文件进行数据恢复。

    优点

    1. 数据安全,可以配置每进行一次命令操作就记录到 aof 文件中一次。

    2. 通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题。

    缺点

    1. AOF 文件比 RDB 文件大,且恢复速度慢。

    2. 数据集大时,比 rdb 启动效率低。

    6.什么是Redis事务?

    事务是逻辑上的一组操作,要么都执行,要么都不执行。Redis 事务不是严格意义上的事务,只是用于帮助用户在一个步骤中执行多个命令。单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。

    Redis 事务可以理解为一个打包的批量执行脚本,redis 事务不保证原子性,且没有回滚,中间某条命令执行失败,前面已执行的命令不回滚,后续的指令继续执行。

    Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

    • 批量操作在发送 EXEC 命令前被放入队列缓存。

    • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,前面已执行的命令不回滚,后续的命令继续执行。

    • 事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

    Redis事务的三个阶段

    1. 事务开始 MULTI

    2. 命令入队

    3. 事务执行 EXEC

    Redis事务的相关命令:

    命令描述
    WATCHWATCH 命令是一个乐观锁,可以为 Redis 事务提供 check-and-set (CAS)行为。可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行,监控一直持续到EXEC命令。
    UNWATCHUNWATCH命令可以取消watch对所有key的监控。
    MULTIMULTI命令用于开启一个事务,它总是返回OK。MULTI执行之后,客户端可以继续向服务器发送任意多条命令,这些命令不会立即被执行,而是被放到一个队列中,当EXEC命令被调用时,所有队列中的命令才会被执行。
    EXECEXEC:执行所有事务块内的命令。返回事务块内所有命令的返回值,按命令执行的先后顺序排列。当操作被打断时,返回空值 nil 。
    DISCARD通过调用DISCARD,客户端可以清空事务队列,并放弃执行事务, 并且客户端会从事务状态中退出。

    7.谈谈你对Redis集群方案——哨兵模式 的理解

    哨兵的介绍

    sentinel,中文名是哨兵。哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能:

    • 集群监控:负责监控 redis master 和 slave 进程是否正常工作。

    • 消息通知:如果某个 redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。

    • 故障转移:如果 master node 挂掉了,会自动转移到 slave node 上。

    • 配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址。

    哨兵用于实现 redis 集群的高可用,本身也是分布式的,作为一个哨兵集群去运行,互相协同工作。

    8.Redis主从复制的原理是什么?

    1. 从节点执行 slaveof 命令

    2. 从节点只是保存了 slaveof 命令中主节点的信息,并没有立即发起复制

    3. 从节点内部的定时任务发现有主节点的信息,开始使用 socket 连接主节点

    4. 连接建立成功后,发送 ping 命令,希望得到 pong 命令响应,否则会进行重连

    5. 如果主节点设置了权限,那么就需要进行权限验证;如果验证失败,复制终止。

    6. 权限验证通过后,进行数据同步,这是耗时最长的操作,主节点将把所有的数据全部发送给从节点。

    7. 当主节点把当前的数据同步给从节点后,便完成了复制的建立流程。接下来,主节点就会持续的把写命令发送给从节点,保证主从数据一致性

    9.Redis如何实现分布式锁?

    Redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系,Redis中可以使用SETNX命令实现分布式锁。

    SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。

    当且仅当 key 不存在,将 key 的值设为 value。若给定的 key 已经存在,则 SETNX 不做任何动作

    返回值:设置成功,返回 1 。设置失败,返回 0 。


    使用SETNX完成同步锁的流程及事项如下:

    • 使用SETNX命令获取锁,若返回0(key已存在,锁已存在)则获取失败,若返回1则获取成功

    • 为了防止获取锁后程序出现异常,导致其他线程/进程调用SETNX命令总是返回0而进入死锁状态,需要为该key设置一个合理的过期时间

    • 释放锁,使用DEL命令将锁数据删除

    10.Redis中的缓存穿透、缓存击穿、缓存雪崩是什么?

    缓存穿透:

    当我们访问某个key时,这个key对应的数据在数据源并不存在,每次针对这个key的请求从缓存中都获取不到,那么这些请求都会压到数据源(DB),从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。

    解决方案:

    • 对空值缓存:如果一个查询返回的数据为空(不管是数据是否不存在),我们仍然把这个空结果(null)进行缓存,设置空结果的过期时间会很短,最长不超过五分钟。
    • 设置可访问的名单(白名单):使用bitmaps类型定义一个可以访问的名单,名单id作为bitmaps的偏移量,每次访问和bitmap里面的id进行比较,如果访问id不在bitmaps里面,进行拦截,不允许访问。
    • 采用布隆过滤器:将所有可能存在的数据哈希到一个足够大的bitmaps中,一个一定不存在的数据会被 这个bitmaps拦截掉,从而避免了对底层存储系统的查询压力。

    缓存击穿:

    key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

    解决方案:

    • 预先设置热门数据:在redis高峰访问之前,把一些热门数据提前存入到redis里面,加大这些热门数据key的存活时长,避免在高并发期间这些数据过期。
    • 实时调整:现场监控哪些数据热门,实时调整key的过期时长。
    • 使用锁

    缓存雪崩:

    当我们访问多个key对应的数据时,这些key在redis中都过期(无法获取)了,那么这些大量的高并发请求就会转到后端DB中去查找访问,进而造成了数据库的崩溃现象。缓存雪崩与缓存击穿的区别在于:缓存雪崩是针对很多key而言的缓存,而缓存击穿则是针对某一个key。

    解决方案:

    • 构建多级缓存架构:nginx缓存 + redis缓存 +其他缓存(ehcache等)。
    • 使用锁或队列:用加锁或者队列的方式保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。不适用高并发情况。
    • 设置过期标志更新缓存:记录缓存数据是否过期(设置提前量),如果过期会触发通知另外的线程在后台去更新实际key的缓存。
    • 将缓存失效时间分散开:比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。
    展开全文
  • 文章目录: 1.安装与导入 1.1 测试代码 2.Java中使用Redis命令 2.1 对数据类型String进行简单操作 2.2对数据类型List进行简单操作...在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redi...

    文章目录:

    1.安装与导入

    1.1 测试代码

    2.Java中使用Redis命令

    2.1 对数据类型String进行简单操作 

    2.2 对数据类型List进行简单操作

    2.3 对数据类型Hash进行简单操作

    2.4 对数据类型Set进行简单操作

    2.5 对数据类型ZSet进行简单操作

    2.6 Redis Java Keys 实例(对应Redis中 KEYS * 命令)


    1.安装与导入

    在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java。 

    我们需要下载 jedis.jar 驱动包:jedis-2.9.0.jar(并非最新版本)

    写在前面:Redis中有哪些命令,与Java连接之后,这些命令自然就变成了相应的方法,供大家调用!!!

    而后,打开编译器(我用的是Eclipse),新建一个Java Project,右键单击项目 → Build Path → Add External Archives to Java Build Path,之后会出现如下界面:👇👇👇

    完成以上步骤之后,我们写一个测试代码来检验一下Redis服务是否与Java环境连接成功!!!(在这之前,你需要打开Redis服务端)

    1.1 测试代码

    package study.redis.java;
    
    import redis.clients.jedis.Jedis;
    
    public class JedisDemo1 {
    	public static void main(String[] args) {
    		//连接本地的 Redis 服务
    		Jedis jedis=new Jedis("localhost");
    		//如果 Redis 服务设置了密码,需要添加下面这行代码
    		jedis.auth("szh2656307671");
    		System.out.println("连接成功");
    		//调用ping()方法查看 Redis 服务是否运行
    		System.out.println("Redis服务正在运行:" + jedis.ping());
    	}
    }

    代码成功运行出如下结果,即连接成功!!! 


    2.Java中使用Redis命令

    2.1 对数据类型String进行简单操作 

    package study.redis.java;
    
    import redis.clients.jedis.Jedis;
    
    public class JedisDemo2 {
    	public static void main(String[] args) {
    		Jedis jedis=new Jedis("localhost");
    		jedis.auth("szh2656307671");
    		System.out.println("连接成功");
    		System.out.println("Redis服务正在运行:" + jedis.ping());
    		
    		//通过 Redis String字符串中的set命令设置相应的数据
    		jedis.set("mykey","redis");
    		
    		//通过 Redis String字符串中的get命令获取相应的数据
    		System.out.println("redis存储的字符串为:" + jedis.get("mykey"));
    	}
    }

    2.2 对数据类型List进行简单操作

    package study.redis.java;
    
    import redis.clients.jedis.Jedis;
    import java.util.List;
    
    public class JedisDemo3 {
    	public static void main(String[] args) {
    		Jedis jedis=new Jedis("localhost");
    		jedis.auth("szh2656307671");
    		System.out.println("连接成功");
    		System.out.println("Redis服务正在运行:" + jedis.ping());
    		
    		//通过 Redis List列表中的lpush命令设置相应的数据
    		jedis.lpush("key","HTML");
    		jedis.lpush("key","CSS");
    		jedis.lpush("key","JavaScript");
    		
    		//同时存入Java list集合中
    		List<String> list=jedis.lrange("key",0,2);
    		for(int i=0;i<list.size();i++) {
    			System.out.println("Redis列表项存储的数据为:" + list.get(i));
    		}
    		
    		//通过 Redis List列表中的lrange命令获取相应的数据
    		System.out.println("此时Redis列表项中的数据为:" + jedis.lrange("key",0,2));
    	}
    }

    2.3 对数据类型Hash进行简单操作

    package study.redis.java;
    
    import redis.clients.jedis.Jedis;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Set;
    
    public class JedisDemo4 {
    	public static void main(String[] args) {
    		Jedis jedis=new Jedis("localhost");
    		jedis.auth("szh2656307671");
    		System.out.println("连接成功");
    		System.out.println("Redis服务正在运行:" + jedis.ping());
    		
    		//通过 Redis Hash哈希中的hset命令设置相应的数据
    		jedis.hset("key1","field1","封装");
    		jedis.hset("key1","field2","继承");
    		jedis.hset("key1","field3","多态");
    		
    		//转为Java Map集合
    		Map<String,String> map=jedis.hgetAll("key1");
    		Set<Map.Entry<String,String>> set=map.entrySet();
    		Iterator<Map.Entry<String,String>> iterator=set.iterator();
    		while(iterator.hasNext()) {
    			Map.Entry<String,String> kv=iterator.next();
    			Object keys=kv.getKey();
    			Object values=kv.getValue();
    			System.out.println("键:" + keys + ",值:" + values);
    		}
    		
    		//通过 Redis Hash哈希中的hgetAll命令获取相应的数据
    		System.out.println("此时Redis Hash中的数据为:" + jedis.hgetAll("key1"));
    	}
    }

    2.4 对数据类型Set进行简单操作

    package study.redis.java;
    
    import redis.clients.jedis.Jedis;
    import java.util.Set;
    import java.util.Iterator;
    
    public class JedisDemo5 {
    	public static void main(String[] args) {
    		Jedis jedis=new Jedis("localhost");
    		jedis.auth("szh2656307671");
    		System.out.println("连接成功");
    		System.out.println("Redis服务正在运行:" + jedis.ping());
    		
    		//通过 Redis Set集合中的sadd命令设置相应的数据
    		jedis.sadd("key2","huawei");
    		jedis.sadd("key2","oppo");
    		jedis.sadd("key2","vivo");
    		
    		//转为Java Set集合
    		Set<String> hashset=jedis.smembers("key2");
    		Iterator iterator=hashset.iterator();
    		while(iterator.hasNext()) {
    			System.out.println("Set集合中的数据为:" + iterator.next());
    		}
    		
    		//通过 Redis Set集合中的smembers命令获取相应的数据
    		System.out.println("此时Redis Set集合中的数据为:" + jedis.smembers("key2"));
    	}
    }

    2.5 对数据类型ZSet进行简单操作

    package study.redis.java;
    
    import redis.clients.jedis.Jedis;
    import java.util.Set;
    import java.util.Iterator;
    
    public class JedisDemo6 {
    	public static void main(String[] args) {
    		Jedis jedis=new Jedis("localhost");
    		jedis.auth("szh2656307671");
    		System.out.println("连接成功");
    		System.out.println("Redis服务正在运行:" + jedis.ping());
    		
    		//通过 Redis ZSet集合中的zadd命令设置相应的数据
    		jedis.zadd("key3",44,"red");
    		jedis.zadd("key3",44,"green");
    		jedis.zadd("key3",44,"blue");
    		jedis.zadd("key3",1,"black");
    		jedis.zadd("key3",80,"white");
    		
    		//转为Java Set集合
    		Set<String> set=jedis.zrangeByScore("key3",0,100);
    		Iterator iterator=set.iterator();
    		while(iterator.hasNext()) {
    			System.out.println("Set集合中的数据为:" + iterator.next());
    		}
    		
    		//通过 Redis ZSet集合中的zrangeByScore命令获取相应的数据
    		System.out.println("此时Redis ZSet集合中的数据为:" + jedis.zrangeByScore("key3",0,100));
    	}
    }

    2.6 Redis Java Keys 实例(对应Redis中 KEYS * 命令)

    package study.redis.java;
    
    import redis.clients.jedis.Jedis;
    import java.util.Set;
    import java.util.Iterator;
    
    public class JedisDemo7 {
    	public static void main(String[] args) {
    		Jedis jedis=new Jedis("localhost");
    		jedis.auth("szh2656307671");
    		System.out.println("连接成功");
    		System.out.println("Redis服务正在运行:" + jedis.ping());
    		
    		//获取此时Redis数据库中的所有键
    		Set<String> keys=jedis.keys("*");
    		Iterator<String> iterator=keys.iterator();
    		while(iterator.hasNext()) {
    			System.out.println(iterator.next());
    		}
    		
    		System.out.println("此时Redis数据库中存在这些键:" + jedis.keys("*"));
    	}
    }

     

    展开全文
  • Java操作Redis存储对象类型数据

    千次阅读 2018-12-24 11:41:15
     关于JAVA去操作Redis时,如何存储一个对象的数据,这是大家非常关心的问题,虽然官方提供了存储String,List,Set等等类型,但并不满足我们现在实际应用。存储一个对象是非常常见的。经过网上查找资料以及参考其他...

    背景描述

         关于JAVA去操作Redis时,如何存储一个对象的数据,这是大家非常关心的问题,虽然官方提供了存储String,List,Set等等类型,但并不满足我们现在实际应用。存储一个对象是非常常见的。经过网上查找资料以及参考其他网友的代码和实践操作后,整理出Redis如何存储一个对象的demo代码,如果有错误的地方大家可以留言指出。

    参考资料

    参考地址:

    https://blog.csdn.net/bang_come/article/details/79098866

    https://www.cnblogs.com/JKayFeng/p/5911544.html

    原理

    在存储对象时先进行序列化,取出数据时再进行反序列化。

     

    Redis版本

    Redis3.0

    https://mvnrepository.com/artifact/redis.clients/jedis

    Demo如下

    Bean代码

    package com.obj.bean;

    import java.io.Serializable;

    public class Person implements Serializable {
        /**
         * 序列化
         */
        private static final long serialVersionUID = 1L;
        public String userName;
        public String password;
        public int age;
        public String getUserName() {
            return userName;
        }
        public void setUserName(String userName) {
            this.userName = userName;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        

    }


    序列化工具类代码

    package com.serial.tool;

    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;

    public class SerializeObjectTool {
        //序列化
        public static byte[] serialize(Object obj) {
            ObjectOutputStream obi = null;
            ByteArrayOutputStream bai = null;
            try {
                bai = new ByteArrayOutputStream();
                obi = new ObjectOutputStream(bai);
                obi.writeObject(obj);
                byte[] byt = bai.toByteArray();
                return byt;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        // 反序列化
        public static Object unserizlize(byte[] byt) {
            ObjectInputStream oii = null;
            ByteArrayInputStream bis = null;
            bis = new ByteArrayInputStream(byt);
            try {
                oii = new ObjectInputStream(bis);
                Object obj = oii.readObject();
                return obj;
            } catch (Exception e) {

                e.printStackTrace();
            }

            return null;
        }

    }

    测试代码

    package com.redis.client;

    import com.obj.bean.Person;
    import com.serial.tool.SerializeObjectTool;

    import redis.clients.jedis.Jedis;

    public class RedisObjectClient {

        public static void main(String[] args) {
            // TODO Auto-generated method stub

            Jedis redis = new Jedis("10.190.130.143", 6379);
            redis.auth("sa123456");

            // 存对象
            Person p = new Person(); // peson类记得实现序列化接口 Serializable
            p.setAge(20);
            p.setUserName("姚波");
            p.setPassword("123456");
            byte[] personByte = SerializeObjectTool.serialize(p);
            redis.set("person".getBytes(), personByte);

           //取对象
            byte[] byt = redis.get("person".getBytes());
            Object obj = SerializeObjectTool.unserizlize(byt);
            if (obj instanceof Person) {
                System.out.println(((Person) obj).getUserName());
                System.out.println(((Person) obj).getPassword());
                System.out.println(((Person) obj).getAge());
            }

        }

    }

    运行结果

    查看redis

    展开全文
  • java中使用redis pom依赖 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</...

    java中使用redis(含json类型与java类型装换)

    1. pom依赖
    <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.0.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.56</version>
    </dependency>
    
    
    1. 工具类,用于连接redis
    public class JedisConnect {
    	public static Jedis Conn(){
    		Jedis jedis=new Jedis("120.27.244.176");
    		return jedis;
    	}
    }
    
    1. 存放一个redis,此处模拟session共享
    //连接
    Jedis jedis=JedisConnect.Conn();
    //对象转json字符串
    String json_user=JSONObject.toJSONString(user);
    /*
    集合转换成json集合
    String JList=JSONArray.toJSONString(list); 
    */
    //放入redis
    jedis.set("user",json_user);
    //设置存活时间
    jedis.expire("user", 300);
    
    1. 获取redis
    //连接
    Jedis jedis=JedisConnect.Conn();
    //获取redis中的user(json字符串形式)
    String json_user=jedis.get("user");
    //json字符串转对象
    User user=JSONObject.parseObject(json_user, User.class);
    
    1. 模拟数据库添加灵活使用
    //连接
    Jedis jedis=JedisConnect.Conn();
    //对象转json字符串
    String reward_json=JSONObject.toJSONString(reward);
    /*
    字符串转json对象
    JSONObject json_object=JSONObject.parseObject({"Message":"OK"});
    json集合转java集合
    List<Goods>	list2=	JSONArray.parseArray(JList, Goods.class);
    */
    //存入的时候使用“表名:主键名:主键值”形式存储将自动生成分级目录
    jedis.set("reward:r_id:"+reward.getR_id(), reward_json);
    

    enter description here

    展开全文
  • Java操作Redis存储HashMap对象类型数据

    万次阅读 2018-12-24 17:34:23
     关于JAVA去操作Redis时,如何存储一个对象的数据,这是大家非常关心的问题,虽然官方提供了存储String,List,Set等等类型,但并不满足我们现在实际应用。存储一个对象是非常常见的。经过网上查找资料以及参考其他...
  • Java大数据-Redis

    千次阅读 2018-08-28 10:34:36
    Redis学习结构  Redis基础 Redis概述 ...Redis是一个开源,先进的key-value存储,并用于构建高...Ø相比许多键值数据存储Redis拥有一套较为丰富的数据类型。 ØRedis可以将数据复制到任意数量的从服务器。...
  • redis主要存储类型最常用的五种数据类型: String Hash List Set Sorted set redis不能直接存取对象,如何解决呢? 两种方式 1、利用序列化和反序列化的方式 两层对象存取到redis 示例: 序列化工具类 ...
  • Redis支持存储的数据类型有String,List,Map,Set,Hash及Zset。 由于简单的操作Redis的基本类型在网上很容易就找到一堆资料,所以今天笔者主要写如何使用redis存储自定义类型Redis中支持的基本类型String,...
  • Redis介绍 && Java客户端操作Redis

    千次阅读 2015-09-28 14:13:52
    Redis介绍 && Java客户端操作Redis本文...redis介绍 大多数时候,我们都将 redis 称作是内存数据库,它在运行过程中,将键值对信息存储在内存中,同时在后台以异步的形式写入本地数据库中(默认是:dump.rdb,在 redi
  • java项目——Redis

    千次阅读 2016-01-31 23:26:21
    项目中用到了Redis,先简单总结一下。   定义  Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可...和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合
  • Java面试——Redis 相关

    2019-10-19 19:05:04
    Java面试——Redis 相关 1,redis的介绍: redis是一个非关系型数据库,NoSql redis是一个内存型数据库,把数据存储在内存上,自动...2,redis的常用的存储数据类型: string,hash,set,zset,list 3,redis的缓存...
  • Redis数据存储类型

    2020-07-25 20:46:41
    Redis数据存储类型
  • redis存储数据格式是HashMap 1.通过ArrayList构造函数将map.entrySet()转换成list List<Map.Entry<String,String>> list= new ArrayList<>(jedis.hgetAll(“redis的key值”).entrySet()); 2....
  • 转载:Redis和Memcached的区别(数据类型、内存管理、数据持久化、集群管理) 转载:Redis的五种对象类型及其底层实现 转载:redis 的两种持久化方式及原理 转载:Redis学习笔记9--Redis持久化 转载:Redis ...
  • 03-Java中操作redis实践

    千次阅读 多人点赞 2021-08-07 14:30:40
    文章目录准备工作创建工程添加项目依赖Jedis的应用简介准备工作快速入门实现基础类型操作连接池JedisPool应用RedisTemplate应用简介准备工作快速入门实现StringRedisTemplate 应用RedisTemplate 应用定制...
  • 出现这种问题,是因为你在项目里配置redis的时候选择了stringRedisSerializer()导致的,仔细检查代码里关于redis的配置部分,你能看到 redisTemplate.setKeySerializer(stringRedisSerializer()); redisTemplate....
  • Java代码实现Redis的CRUD

    千次阅读 2018-03-26 16:23:28
    接下来介绍如何在Java中使用Redis来实现数据存储和查询。1.首先,修改配置文件,将其修改为可以远程链接:vi /etc/redis/redis.conf(/etc/redis 是在线安装时默认的安装目录)可能因为权限问题无法编辑,可以使用...
  • redis入门: 1、Redis服务器搭建 2、向业务逻辑中添加缓存。 3、使用redis做缓存 4、缓存同步
  • 使用Java操作Redis的字符串类型、list链表类型、hash哈希表类型、set无序集合类型的数据,简单易懂。
  • 溪源的Java笔记—Redis服务器 前言 前段时间我对Mysql数据库的知识点进行了梳理,本篇博客我对Redis服务器的相关的知识点进行整理,Redis可以是我们在Web应用中提升性能的利器,可以说Redis是一个中高级开发者必备的...
  • Java使用redis 以及 redis持久化

    千次阅读 2018-12-12 11:24:12
    开始在 Java 中使用 Redis 前, 我们需要确保已经安装了 redis 服务及 Java redis 驱动,且你的机器上能正常使用 Java。 1.首先你需要下载驱动包 下载 jedis.jar. 在你的 classpath 中包含该驱动包。 &amp;lt...
  • Java操作Redis

    2018-06-08 16:46:26
    java连接并操作Redis数据库,包含了常用的命令! Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列...
  • 看了一天NoSql的Redis数据库,命令太多了不总结了,整理一下数据类型JavaRedis的相关操作。
  • Java大数据当中,Redis作为数据存储的一种的解决方案,主流运用很多。Redis可作为数据库、缓存或者消息代理,从内存加载数据,相比传统的数据库解决方案,具有更快的读写性能。今天我们就来讲讲,Java大数据分布式...
  • Java如何连接Redis?

    2018-10-31 10:48:00
    安装Redis以后,如何使用在Java中呢? 1、下载 jedis.jar包,这是驱动(Jedis就是redis支持java的第三方类库,使用Jedis类库,才可以操作redis数据库) PS:Jedis2.7以上的版本才支持集群操作。 或者利用Maven引入...
  • 剑指Java面试-Redis整理(不定期更新!)Redis常见面试题。五大基础数据结构、分布式锁、异步队列、持久化、Pipeline、Redis集群....
  • Redis及如何在Java中使用Redis

    千次阅读 2017-10-30 23:05:06
    Redis 简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。 Redis 与其他 key – value 缓存产品有以下三个...Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,
  • java redis实战

    2020-05-12 16:50:47
    Redis实战java Redis实战基础回顾Redis的数据类型StringHashListSetZset在java中使用redis引入redis驱动包:测试服务连接存储数据 系列文章 Redis第一天 Redis第二天 Redis第三天 Redis第四天 Redis第五天 java ...
  • REmote DIctionary Server(Redis)是一个由Salvatore Sanfilippo写的key-value存储系统。它通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Map)、列表(list)、集合(sets)和有序集合...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 85,334
精华内容 34,133
关键字:

java存储类型redis

java 订阅
redis 订阅