为什么要用redis?
数据读取的性能出现瓶颈,而瓶颈的源头一般是在磁盘的I/O上,随着互联网的技术的进一步发展,各种类型的应用层出不穷,导致在当今计算、大数据盛行的时代,对性能有了进一步的要求体现四个方面:
1、低延迟的读写速度
2、支撑海量的数据和流量
3、大规模的集群管理
4、庞大的营运成本
为了克服这些问题,NoSQL应用诞生。它同时具备了高性能、可扩展性强、高可用等优点。
Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用了ANSIC编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,具备以下特性:
1、基于内存运行、性能高效
2、支持分布式、理论上可以无限扩展
3、key-value 存储系统
4、开源使用ANSIC语言编写。遵守了BSD协议、支持网络,可基于内存也可以持久化的日志,key-value数据库,并且提供了多种语言API
相比于其他数据库。Redis具备的特点
1、C/S通信模型
2、单进程单线程模型
3、丰富的数据类型
4、持久化
5、操作具有原子性
6、高并发读写
7、支持lua脚本
使用案例:github、微博、twitter、阿里巴巴、百度、美团、搜狐
Redis的数据类型以及主要特点:
Redis 提供了数据类型主要分为5种自有类型和一种自定义一类型,5种类型包括:String 类型、哈希类型、列表类型、集合类型、顺序集合类型(Zset)。
String 十一个二进制安全的字符串,意味着他不仅能存储字符串,还能存图片、视频等多种类型,最大长度支持512M。
顺序集合类型:
ZSet是一种有序集合类型。每个元素都会关联一个double类型的分数权值,通过这个权值来为集合中的成员进行从小到大的排序,与Set类型一样,底层也是通过哈希表实现的。
Redis 的使用
需要的东西:绿色版redis、redis管理工具、
-
继续在springMVC的项目下:配置文件加redis依赖
-
使用绿色版的redis,不需要启动服务,注意不要关闭窗口
-
打开redis管理工具
redis的密码无法识别
找到在redis3文件夹下的redis.conf:找到port与requirepass
- 启动redis cmd命令下,注意不要关闭窗口
如果此处报错说明端口占用,在电脑管理的服务中关闭其他的redis
- redis管理工具连接redis
Test包对redis数据类型练习
java包下创建test包与一个redisTest.java,做一个测试看看是否能链接上redis
创建一个测试目录:
字符串类型的数据操作
public void TestD(){
Jedis jedis = new Jedis("localhost");
jedis.auth("123456");
System.out.println("连接成功");
System.out.println("服务正在运行:" + jedis.ping());
//jedis.flushDB();//清空数据
jedis.set("hello","hello");
System.out.println(jedis.get("hello"));
// 向hello这个字符串 value中追加内容
jedis.append("hello","world!");
System.out.println(jedis.get("hello"));
//使用 set 覆盖原有内容 (key 的相同)
jedis.set("hello","123");
//添加 key 为hello2 值为 word2 设置生命周期为2秒
jedis.setex("hello2",2,"world2");
try {
//线程 睡眠三秒
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(jedis.get("hello2"));
//一次添加多个key-value对
jedis.mset("a","1","b","2");
List<String> values = jedis.mget("a", "b");//返回一个存放字符串的集合
System.out.println(values);//[1, 2]
//批量删除
jedis.del("a","b");
System.out.println(jedis.exists("a"));
System.out.println(jedis.exists("b"));
jedis.close();
}
数组与集合的操作
public void TestC(){
Jedis jedis = new Jedis("localhost");
jedis.auth("123456");
System.out.println("连接成功");
System.out.println("服务正在运行:" + jedis.ping());
//jedis.flushDB(); // 清空数据
//添加集合
jedis.rpush("names","唐僧");
jedis.rpush("names","悟空");
jedis.rpush("names","八戒");
jedis.rpush("names","悟净");
//取出 Redis 中集合的数据
// lrange 按照下标获取 -1 表示最后一个元素
List<String> names = jedis.lrange("names", 0, -1);
System.out.println(names);
//添加数组
jedis.lpush("scores","100");
jedis.lpush("scores","77");
jedis.lpush("scores","99");
jedis.lpush("scores","88");
System.out.println("获取数组长度:"+jedis.llen("scores"));
System.out.println("数组内容:"+jedis.lrange("scores",0,-1));
System.out.println("排序:"+jedis.sort("scores"));
jedis.lset("scores",0,"66");// 修改对应下标的内容
System.out.println("修改后的数组内容:"+jedis.lrange("scores",0,-1));
//删除列表指定下标的值
System.out.println(jedis.lrem("scores",1,"99"));//1
// 删除区间以外的数据
System.out.println(jedis.ltrim("scores",0,1));//ok
System.out.println("删除后的数组内容:"+jedis.lrange("scores",0,-1));//删除后的数组内容:[66, 77]
// 列表出栈
System.out.println(jedis.lpop("scores"));//66
//在77 前插入 22
jedis.linsert("scores", BinaryClient.LIST_POSITION.BEFORE,"77","22");
//在77 后插入 33
jedis.linsert("scores", BinaryClient.LIST_POSITION.AFTER,"77","33");
System.out.println("插入后的数组内容:"+jedis.lrange("scores",0,-1));//插入后的数组内容:[22, 77, 33]
jedis.close();
}
zadd与hmset方法举例
zadd是 有序集合的
public void TestE(){
Jedis jedis = new Jedis("localhost");
jedis.auth("123456");
System.out.println("连接成功");
System.out.println("服务正在运行:" + jedis.ping());
//jedis.flushDB();
HashMap<String, Double> scoreMembers = new HashMap<>();
scoreMembers.put("aaa", 1001.0);
scoreMembers.put("bbb", 1002.0);
scoreMembers.put("ccc", 1003.0);
scoreMembers.put("ddd", 1004.0);
String key = "mysortset";
jedis.zadd(key,1005.0,"eee");
jedis.zadd(key,scoreMembers);
//获取一个排序的集合中的成员数量
System.out.println(jedis.zcard(key));
//返回的成员在指定范围内的有序集合 ,0表示第一个元素 1表示第二个元素 以此类推
//负数下标 -1 最后一个元素 -2表示倒数第二个元素
Set<String> coll = jedis.zrange(key, 0, -1);
System.out.println(coll);
//返回指定返回的逆序集合
coll = jedis.zrevrange(key, 0, -1);
System.out.println(coll);//[eee, ddd, ccc, bbb, aaa]
//返回指定key对应的value
System.out.println(jedis.zscore(key,"bbb"));//1002.0
//删除元素
jedis.zrem("key","aaa");
System.out.println(jedis.zrange(key, 0, -1));
//给定值 获取范围内 成员的数量
System.out.println(jedis.zcount(key,1002.0,1005.0));
jedis.close();
}
,hmset是哈希的
public void TestF(){
Jedis jedis = new Jedis("localhost");
jedis.auth("123456");
System.out.println("连接成功");
System.out.println("服务正在运行:" + jedis.ping());
jedis.flushDB();
String key = "myhash";
Map<String, String> hash = new HashMap<>();
hash.put("aaa", "111");
hash.put("bbb", "222");
hash.put("ccc", "333");
hash.put("ddd", "444");
jedis.hmset(key,hash);
//追加元素
jedis.hset(key,"eee","555");
//获取hash的所有元素(key值)
System.out.println(jedis.hkeys(key));
//获取hash的所有元素值(value值)
System.out.println(jedis.hvals(key));
//获取hash中所有元素的数量
System.out.println(jedis.hlen(key));
//获取hash中全部的域和值 以键值对的形式返回
Map<String, String> stringMap = jedis.hgetAll(key);//{aaa=111, ccc=333, bbb=222, eee=555, ddd=444}
System.out.println(stringMap);
//判断给定的key值是否在哈希集合中存在
System.out.println(jedis.hexists(key,"bbb"));
//获取hash中指定字段对应的值
System.out.println("获取hash中指定字段对应的值:"+jedis.hmget(key,"aaa","ccc"));
//获取指定的值
System.out.println(jedis.hget(key,"aaa"));//111
//删除指定的值
System.out.println(jedis.hdel(key,"aaa"));//1
System.out.println(jedis.hgetAll(key));
//为key中 指定的value增加固定数值
jedis.hincrBy(key,"bbb",100);
System.out.println(jedis.hgetAll(key));
}
redis管理工具查看如下: