redis(一):redis基本介绍

版权声明:本文为博主原创文章,转载请注明文章链接 https://blog.csdn.net/zhanyu1/article/details/89154428

1、redis基本特性

Redis是基于内存的Key-Value型高性能的NoSQL数据库。

1.1、基于键值对的数据结构

redis主要提供了5种数据结构(即5种不同类型的值value):

字符串类型(String)散列类型(Hash)列表类型(List)集合类型(Set)有序集合类型(SortedSet,简称Zset)

1.2、速度快

1.Redis的所有数据都是存放在内存中的,所以把数据放在内存中是Redis速度快的最主要原因。
2. Redis是用C语言实现的,一般来说C语言实现的程序“距离”操作系统更近,执行速度 相对会快。
3. Redis使用了单线程架构,预防了多线程可能产生的竞争问题。

1.3、比较丰富的功能

1.提供了键过期功能,可以用来实现缓存 提供了发布订阅功能,可以用来实现消息系统 。
2.提供了简单的事务功能,能在一定程度上保证事务特性。
3.提供了流水线(Pipeline)功能,这样客户端能将一批命令一次性传到Redis,减少了网络的开销。

1.4、客户端语言多

Redis提供了简单的TCP通信协议,很多编程语言可以很方便的接入到Redis,所以支持Redis的客户端语言也非常多,基本涵盖了主流的编程语言。

  • 官网中列出了一些Java的客户端,比如Jedis、Redisson、Jredis、JDBC-Redis等,其中官方推荐使用Jedis和Redisson。
1.5、持久化

由于redis的数据是放在内存中的,一旦发生断点或者机器故障,会丢失重要的数据,因此为了保证数据的持久性,提供了两种持久化到硬盘的方案:

  • RDB方式(默认)
  • AOF方式
1.6、主从复制

Redis提供了复制功能,实现了多个相同数据的Redis副本,复制功能是分布式Redis的基础。

1.7、高可用和分布式

Redis从2.8版本提供了高可用实现:Redis Sentinel (哨兵模式),它能够保证Redis节点的故障发现和故障自动转移。

Redis从3.0版本提供了分布式实现Redis Cluster 集群,保证了高可用、高性能、高可扩展性。

2、应用场景

2.1、内存数据库

可以用于实现登录信息、购物车信息、用户浏览记录等功能。

扫描二维码关注公众号,回复: 6501514 查看本文章
2.2、缓存服务器

可以用于实现商品数据、广告数据等功能。

2.3、解决分布式集群架构中的session分离问题(session共享)
2.4、消息队列

消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务解耦、非实时业务削峰等特性。Redis提供了发布订阅功能和阻塞队列的功能,虽然功能比较少,但是对于一般的消息队列功能基本可以满足。

可以用于实现秒杀、抢购等功能。

2.5、应用排行榜

排行榜系统几乎存在于所有的网站,例如按照热度排名的排行榜,按照发布时间的排行榜,按照各种复杂维度计算出的排行榜,Redis提供了列表和有序集合数据结构,合理的使用这些数据结构可以很方便的构建各种排行榜系统。

2.6、网站访问统计

3、Java客户端Jedis

3.1、添加jar包

	  <dependency>
          <groupId>redis.clients</groupId>
          <artifactId>jedis</artifactId>
          <version>2.9.0</version>
      </dependency>

3.2、单实例连接

@Test
    public void testJedis() {
        //创建一个Jedis的连接
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        //执行redis命令
        jedis.set("key", "hello world");
        //从redis中取值
        String result = jedis.get("key");
        //打印结果
        System.out.println(result);
        //关闭连接
        jedis.close();
    }

3.3、连接池连接

@Test
    public void testJedisPool() {
        //创建一连接池对象
        JedisPool jedisPool = new JedisPool("127.0.0.1", 6379);
        //从连接池中获得连接
        Jedis jedis = jedisPool.getResource();
        String result = jedis.get("key") ;
        System.out.println(result);
        //关闭连接
        jedis.close();
        //关闭连接池
        jedisPool.close();
    }

3.4、spring整合JedisPool

  • 配置spring配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd 
		http://www.springframework.org/schema/mvc 
		http://www.springframework.org/schema/mvc/spring-mvc.xsd 
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context.xsd 
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop.xsd 
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx.xsd ">

	<!-- 连接池配置 -->
	<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="softMinEvictableIdleTimeMillis" value="10000" />
		<!-- 获取连接时的最大等待毫秒数,小于零:阻塞不确定的时间,默认-1 -->
		<property name="maxWaitMillis" value="1500" />
		<!-- 在获取连接的时候检查有效性, 默认false -->
		<property name="testOnBorrow" value="false" />
		<!-- 在空闲时检查有效性, 默认false -->
		<property name="testWhileIdle" value="true" />
		<!-- 连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true -->
		<property name="blockWhenExhausted" value="false" />
	</bean>

	<!-- redis单机 通过连接池 -->
	<bean id="jedisPool" class="redis.clients.jedis.JedisPool"
		destroy-method="close">
		<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
		<constructor-arg name="host" value="主机ip" />
		<constructor-arg name="port" value="端口号" />
	</bean>
</beans>

   @Test
    public void testJedisPool() {
        JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
        Jedis jedis = null;
        try {
            jedis = pool.getResource();

            jedis.set("key1", "xiaoli");
            String name = jedis.get("key1");
            System.out.println(name);
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            if (jedis != null) {
                // 关闭连接
                jedis.close();
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/zhanyu1/article/details/89154428