积累
/*把数据库二维表存放到redis中
Set Tb_item:3:id =3
Set Tb_item:3:username =tom
Set Tb_item:4:id =4
Set Tb_item:4:username =jack*/
Redis简介
关系型数据库和nosql数据库
关系型数据库是基于关系表的数据库,最终会将数据持久化到磁盘上,而nosql数据库是基于特殊的结构,并将数据存储到内存的数据库。从性能上而言,nosql数据库 要优于关系型数据库,从安全性上而言关系型数据库要优于nosql数据库,所以在实际开发中一个项目中nosql和关系型数据库会一起使用,达到性能和安全性的双保证。
为什么要使用Redis
对数据库高并发读写的需求
网站根据用户个性化信息来实时生成动态页面和提供动态信息,基本上无法使用动态页面静态化技术,所以数据库并发负载很高。面对上万次的SQL请求,硬盘IO无法承受。
对海量数据的高效率存储和访问的需求
对于微博,腾讯这些大公司,如果从数据库中几亿的记录中使用SQL查询,这个效率是不能让人忍受的。
对于数据库的高扩展性和高可用性的需求
在web架构中,数据库是最难进行横向扩展的。数据库无法简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于24h服务的网站来讲,对数据库系统进行升级和扩展是很痛苦的,往往需要停机维护和数据迁移。
NoSQL特点
redis是啥
redis是c语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求。键是字符串类型,值的类型目前支持的数据类型如下:
- 字符串类型
- 列表类型
- 集合类型
- 有序集合类型
散列类型
官方测试数据:50个并发执行100000请求,读的速度是110000次/s,写的速度是81000次/s.
应用场景
redis简单使用代码
@Test
//获得单一的jedis对象操作数据库
public void test1(){
//1、获得连接对象
Jedis jedis = new Jedis("127.0.0.1", 6379);
//2、获得数据
String username = jedis.get("username");
System.out.println(username);
//3、存储
jedis.set("addr", "北京");
System.out.println(jedis.get("addr"));
}
//通过jedis的pool获得jedis连接对象
@Test
public void test2(){
//0、创建池子的配置对象
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxIdle(30);//最大闲置个数
poolConfig.setMinIdle(10);//最小闲置个数
poolConfig.setMaxTotal(50);//最大连接数
//1、创建一个redis的连接池
JedisPool pool = new JedisPool(poolConfig, "127.0.0.1", 6379);
//2、从池子中获取redis的连接资源
Jedis jedis = pool.getResource();
//3、操作数据库
jedis.set("xxx","yyyy");
System.out.println(jedis.get("xxx"));
//4、关闭资源
jedis.close();
//测试阶段关池子
pool.close();
}
public class JedisPoolUtils {
private static JedisPool pool = null;
static{
//加载配置文件
InputStream in = JedisPoolUtils.class.getClassLoader().getResourceAsStream("redis.properties");
Properties pro = new Properties();
try {
pro.load(in);
} catch (IOException e) {
e.printStackTrace();
}
//获得池子对象
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxIdle(Integer.parseInt(pro.get("redis.maxIdle").toString()));//最大闲置个数
poolConfig.setMinIdle(Integer.parseInt(pro.get("redis.minIdle").toString()));//最小闲置个数
poolConfig.setMaxTotal(Integer.parseInt(pro.get("redis.maxTotal").toString()));//最大连接数
pool = new JedisPool(poolConfig,pro.getProperty("redis.url") , Integer.parseInt(pro.get("redis.port").toString()));
}
//获得jedis资源的方法
public static Jedis getJedis(){
return pool.getResource();
}
public static void main(String[] args) {
Jedis jedis = getJedis();
System.out.println(jedis.get("xxx"));
}
}
创建JedisCluster类连接redis集群
@Test
public void testJedisCluster() throws Exception {
//创建一连接,JedisCluster对象,在系统中是单例存在
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("127.0.0.1", 7001));
nodes.add(new HostAndPort("127.0.0.1", 7002));
nodes.add(new HostAndPort("127.0.0.1", 7003));
nodes.add(new HostAndPort("127.0.0.1", 7004));
nodes.add(new HostAndPort("127.0.0.1", 7005));
nodes.add(new HostAndPort("127.0.0.1", 7006));
JedisCluster cluster = new JedisCluster(nodes);
//执行JedisCluster对象中的方法,方法和redis一一对应。
//直接使用JedisCluster操作redis,自带连接池。jedisCluster对象可以是单例 的。
cluster.set("cluster-test", "my jedis cluster test");
String result = cluster.get("cluster-test");
System.out.println(result);
//程序结束时需要关闭JedisCluster对象
cluster.close();
}
使用spring配置applicationContext.xml
<!-- 连接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大连接数 -->
<property name="maxTotal" value="30" />
<!-- 最大空闲连接数 -->
<property name="maxIdle" value="10" />
<!-- 每次释放连接的最大数目 -->
<property name="numTestsPerEvictionRun" value="1024" />
<!-- 释放连接的扫描间隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<!-- 连接最小空闲时间 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<!-- 连接空闲多久后释放, 当空闲时间>该值 且 空闲连接>最大空闲连接数 时直接释放 -->
<property name="soft