Redis个人总结及代码实现
来源:互联网 发布:怎样连接网络电视 编辑:程序博客网 时间:2024/06/11 21:34
了解:
什么是NoSQL??
为了解决高并发,高可扩展,高可用,大数据存储问题而产生的数据库解决方案,就是NoSQL数据库
NoSQL,泛指非关系型的数据库,NoSQL即Not-Only SQL,它可以作为关系型数据库的良好补充;但是它不能替代关系型数据库,而且它是存储在内存中,所以它的访问速度很快
NoSQL的数据库分类:
1.键值(key-value)存储数据库(Redis) 典型应用:内容缓存,主要用于处理大量数据的高访问负载 数据模型: 一系列键值对 优势:快速查询 劣势:存储的数据缺少结构化 2.列存储数据库(HBase) 典型应用:分布式的文件系统 数据模型:以列族式存储,将同一列数据存在文件系统中 优势:查找速度快,可扩展性强,更容易进行分布式扩展 劣势:功能相对局限 3.文档型数据库(MongoDB) 典型应用:web应用(与key-value类似,value是结构化的) 数据模型:一系列键值对 优势:数据结构要求不严格 劣势:查询性能不高,而且缺乏统一的查询语法 4.图形(Graph)数据库[InfoGrid] 典型应用:社交网络 数据模型:图结构 优势:利用图结构相关算法 劣势:需要对整个图做计算才能得到结果,不容易做分布式的集群方案
Redis介绍
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库.它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
字符串类型; 散列类型; 列表类型; 集合类型; 有序集合类型
Redis应用场景
缓存(数据查询,短连接,新闻内容,商品内容等等)
分布式集群架构中的session分离
聊天室的在线好友列表
任务队列(秒杀,抢购,12306等等)
应用排行榜
网站访问统计
数据过期处理(可以精确到毫秒)
Redis的特性
1.redis数据访问速度快(数据在内存中)
2.redis有数据持久化机制
持久化机制有两种:
1.定期将内存数据dump到磁盘;
2.aof(append only file)持久化机制–用记日志的方式记录每一条数据更新操作,一旦出现灾难事件,可以通过日志重放来恢复整个数据库
3.redis支持集群模式(容量可以线性扩展)
4.redis相比其他缓存工具(encach/memcached),有一个鲜明的优势:支持丰富的数据结构
Redis安装:
官网:http://redis.io/
第一步:在VMware中安装CentOS系统(Linux)
第二步:在Linuex系统中安装C语言环境
yum install gcc-c++
第三步:将redis的源码包上传到Linux系统
第四步:解压源码包
第五步:进入redis-3.3.3包,然后执行make命令,编译redis的源码
cd /usr/local/redis-3.0.0
make
第六步:安装
make install PREFIX=/usr/local/redis
Redis启动
前端启动,如果客户端关掉或者执行ctrl+c命令;则整个redis服务也停掉
[root@redis01 bin]# ./redis-server
关闭:ctrl+c
后端启动:
第一步:执行cp命令将redis解压缩包中的redis.conf文件拷贝到bin目录下
第二步:修改redis.conf文件
daemonize yes [将no改为yes即可后端启动]
第三步:启动redis服务
bin : ./redis-server redis.conf
ps -ef | grep redis.conf
关闭:
正常关闭: bin: ./redis-cli shutdown
非正常关闭 kill 线程号
Redis客户端
Redis自带的客户端:
bin: ./redis-cli -h 127.0.0.1 -p 6379 [实时使用默认的ip为127.0.0.1 默认的端口为6379]
set s1 redis1
get s1
Redis数据类型:
String 类型
set str1 dance
get str1
del str1
自增[默认+1]: set s1 1 // incr s1
自减[默认-1]: decr s1
自增指定数值: incrby s1 3 => s1+3
自减指定数值: decrby s1 3 => s1-3
设置或者获取多个key/value:
mset name dance age 18
mget name age => dance 18
API代码实现中:
Java客户端jedis
jedis介绍(jave + redis)
1.将对象缓存到String数据结构中 需要注意: 1.将对象序列化成byte数组 2.用对象序列化的方式将pro实例序列化并(读出)写入 3.将ByteArrayOutputStream转换成字节数组 4.将序列化后的对象缓存到string数据结构中 5.获取数据(getByte()) 6.将获取的数据反序列化 ByteArrayInputStream ObjectInputStream 7.读取对象流中的ProduceInfo对象 2.将对象转换成json格式的字符串缓存到String数据结构中 需要注意: 1.把对象转换成json格式 Gson gson = new Gson(); String json = gson.toJson(pro) 2.将json字符串缓存到Redis 3.获取数据 4.将json字符串转换成对象:ProductInfo proInfo = gson.fromJson(jsonRes,ProductInfo.class);
package myRPC.qf.itcast.redis.stringdemo;import com.google.gson.Gson;import redis.clients.jedis.Jedis;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;public class StringDemo2 { private static Jedis jedis = new Jedis("192.168.222.156",6379); //将字符串缓存到String数据结构中 public static void stringTest(){ jedis.set("user:001:name1","dance"); jedis.set("user:002:name1","G-Dragon"); jedis.set("user:003:name1","xiaoming"); jedis.set("user:004:name1","xiaofang"); String username001 = jedis.get("user:001:name1"); String username002 = jedis.get("user:002:name1"); String username003 = jedis.get("user:003:name1"); String username004 = jedis.get("user:004:name1"); System.out.println(username001); System.out.println(username002); System.out.println(username003); System.out.println(username004); } //将对象缓存到String数据结构中 public static void objectTest() throws Exception{ final ProductInfo pro = new ProductInfo(); pro.setName("水瓶"); pro.setDesc("暖手"); pro.setPrice("36"); //将对象序列化成byte数组 final ByteArrayOutputStream bos = new ByteArrayOutputStream(); final ObjectOutputStream oos = new ObjectOutputStream(bos); //用对象序列化的方式将pro实例序列化并写入流中 oos.writeObject(pro); //将bos转换成字节数组 final byte[] pByte = bos.toByteArray(); //将序列化后的对象缓存到string数据结构中 jedis.set("product:001".getBytes(), pByte); //获取数据 final byte[] pByteRes = jedis.get("product:001".getBytes()); //将获取的数据反序列化 final ByteArrayInputStream bis = new ByteArrayInputStream(pByteRes); final ObjectInputStream ois = new ObjectInputStream(bis); //读取对象流中的ProductInfo对象 final ProductInfo pRes = (ProductInfo) ois.readObject(); System.out.println(pRes); } //将对象转换成json格式的字符串缓存到String数据结构中 public static void objectToJsonTest(){ final ProductInfo pro = new ProductInfo(); pro.setName("蜡烛"); pro.setDesc("星星之火"); pro.setPrice("8.88"); //把对象转换成json格式 Gson gson = new Gson(); String json = gson.toJson(pro); //将json字符串缓存到Redis jedis.set("produt:002",json); //获取数据 String jsonRes = jedis.get("product:002"); //将json字符串转换成对象 ProductInfo productInfo = gson.fromJson(jsonRes, ProductInfo.class); System.out.println(jsonRes); System.out.println(productInfo); } public static void main(String[] args) throws Exception {// stringTest();// objectTest(); objectToJsonTest(); }}
//将对象缓存到String数据结构中
结果显示:[最简单的]
//将对象缓存到String数据结构中
结果展示:[注意代码中流的转换]
结果显示:
Hash 类型
hash叫散列类型,它提供了字段和字段值的映射.字段值只能是字符串类型,不支持散列类型,集合类型等其他类型
hset s2 name dance
hget s2 name
hdel s2
hmset s2 name dance age 18
hmget s2 name age
hincrby s2 age 4 => age=24
hkeys s2 => “name”,”age” 获取字段名
kvals s2 => “dance”,”22” 获取字段值
Hash类型在IDEA上代码实现
package myRPC.qf.itcast.redis.hashdemo;import redis.clients.jedis.Jedis;import java.util.Map;import java.util.Set;public class BuyCart { private static Jedis jedis = new Jedis("192.168.222.156",6379); private static final String CART = "cart"; //添加商品 private static void addProductToCart(){ jedis.hset(CART+":username003","气球","100"); jedis.hset(CART+":username004","饮料","20"); jedis.hset(CART+":username005","泡面","30"); jedis.hset(CART+":username006","火腿","40"); jedis.hset(CART+":username007","饼干","35"); jedis.close(); } //查询购物车 public static void getProductInfo(){ String username003 = jedis.hget(CART+":username007","饼干"); final Map<String, String> pFor004 = jedis.hgetAll(CART + ":username005"); final Set<Map.Entry<String, String>> entrySet = pFor004.entrySet(); for(Map.Entry<String,String> e : entrySet){ System.out.println(e.getKey()+": "+e.getValue()); } System.out.println(username003); jedis.close(); }//修改购物车信息 public static void editProductInfo(){ jedis.hset(CART+":username005","干拌面","3"); jedis.hincrBy(CART+":username007","饼干",5); jedis.close(); } public static void main(String[] args) { addProductToCart(); getProductInfo(); System.out.println("-----------------------------"); editProductInfo(); getProductInfo(); }}
结果展示:
List 类型
List是有序可重复的集合
ArrayList与LinkedList的区别:
1.ArrayList使用数组方式存储数据,所以根据索引查询数据速度快,而新增或者删除元素时需要设计到位移操作,所以比较慢
2.LinkedList使用双向链接方式存储数据,每个元素都记录前后元素的指针,所以插入,删除数据时只是更改前后元素的指针指向即可,速度非常快,然后通过下标查询元素时需要从头开始索引所以比较慢,但是如果查询前几个元素或后几个元素速度非常快
redis存储list类型可以实现队列和堆栈,队列是先进先出,而堆栈是先进后出
lpush list1 1 2 3 4 5 6 (从左边存值)
rpush list1 a b c d (从右边存值)
lrange list1 0 3 (查看list值)[结果:6,5,4,3]
lrange list1 0 -1 (查看全部)
lpop list1 [“6”] (从左边弹出一个值)
在IDEA上模拟生产任务与消费任务的形式展示:
生产任务:
import redis.clients.jedis.Jedis;import java.util.Random;import java.util.UUID;public class TaskProduct { private static Jedis jedis = new Jedis("192.168.222.156",6379); public static void main(String[] args) throws Exception { Random random = new Random(); while (true){ int nextInt = random.nextInt(100); Thread.sleep(3000+nextInt); //模拟生产一个任务 String taskId = UUID.randomUUID().toString(); jedis.lpush("task-queue",taskId); System.out.println("生产一个任务: "+ taskId); } }}
消费任务:
import redis.clients.jedis.Jedis;import java.util.Random;public class TaskConsumer { private static Jedis jedis = new Jedis("192.168.222.156",6379); public static void main(String[] args) throws Exception { Random ran = new Random(); while (true){ Thread.sleep(3000); //从task-queue任务队列里取出一个任务的同时放入暂存队列中 String taskId = jedis.rpoplpush("task-queue","temp-queue"); //处理任务 if(ran.nextInt(20)%9 == 0){ //模拟任务失败的情况 //如果任务处理失败,把任务从暂存队列里弹出来放到任务队列里 jedis.rpoplpush("temp-queue","task-queue"); System.out.println("任务处理失败:"+taskId); }else{//任务处理成功 //如果任务处理失败,把暂存暂存队列里的任务删除 jedis.rpop("temp-queue"); System.out.println("任务处理成功:"+taskId); } } }}
结果展示[生产任务]:
结果展示[消费任务]:
SortedSet类型zset
zset在设置时,会给设置一个分数,通过分数,可以进行排序
zadd zset1 1 haha 2 hehe 3 heihei
zrem zset haha
zrange zset 0 3 (全部输出)
zrevrange zset 0 3 (反转)
zrevrange zset 0 3 withscores (连着数字一起输出)
模拟LOL任务出场:
import redis.clients.jedis.Jedis;import java.util.Random;public class LolBoxPlayer { private static Jedis jedis = new Jedis("192.168.222.156",6379); public static void main(String[] args) throws Exception { Random random = new Random(); String[] heros = {"提莫","蒙多","木木","EZ","轮子妈","艾希","贾克斯","亚索","金克斯","奥巴马"}; while(true){ int index = random.nextInt(heros.length); String hero = heros[index]; Thread.sleep(2000); jedis.zincrby("hero:cc1",1,hero); System.out.println(hero + "已经出场!"); } }}
结果显示:
模拟LOL榜单显示:
import redis.clients.jedis.Jedis;import redis.clients.jedis.Tuple;import java.util.Set;public class LolBoxViewer { private static Jedis jedis = new Jedis("192.168.222.156",6379); public static void main(String[] args) throws Exception { int i =1; while(true){ Thread.sleep(3000); System.out.println("--------------------------第"+i+"次查看榜单---------------------"); //从Redis中查询榜单的前3名 final Set<Tuple> heros = jedis.zrevrangeWithScores("hero:cc1", 0, 2); for (Tuple hero: heros){ System.out.println(hero.getElement()+"==="+hero.getScore()); } i ++; System.out.println(""); } }}
结果显示
- Redis个人总结及代码实现
- 个人总结的代码
- redis在spring中的配置及java代码实现
- redis在spring中的配置及java代码实现
- redis在spring中的配置及java代码实现
- redis在spring中的配置及java代码实现
- redis在spring中的配置及java代码实现
- 约瑟夫问题总结及代码实现
- PHP redis操作类 个人总结
- PHP redis操作类 个人总结
- Redis 初学个人总结(自学)
- 关于Redis的相关知识个人总结
- BETA代码的个人总结
- Dropout解析及个人总结
- 单例模式实现总结及代码实现
- Redis异常及使用总结
- 各种排序算法总结及C#代码实现
- iOS越狱检测总结及代码实现(JailBreak)
- SGU 507 Treediff 启发式合并
- Appium移动 自动化测试-环境搭建(1)
- 让Spring架构减化事务配置
- (HDOJ)Children's Queue(java大数大法好)
- 二十、继承
- Redis个人总结及代码实现
- 有关内存空间
- ubuntu的终端里面,随意点击就出现ctrl+C的效果,出现^C
- python基础入门 01
- windows 控制台cmd乱码(及永久修改编码)的解决办法
- [BFS] UVA 11624
- 源码编译安装ss
- 我的小小学习笔记(7)之C++------模板之模板函数
- 电路实验^_^