redis

Redis是一款高性能的键值对数据库,适用于高并发场景。本文介绍了Redis的关系型数据库与NoSQL对比,使用原因,NoSQL的特点,以及Redis的字符串、哈希、列表、集合、有序集合等数据类型。同时,详细讲解了Redis的主从复制和集群配置,包括集群架构和容错机制,适合初学者快速掌握Redis的基础应用。
摘要由CSDN通过智能技术生成

积累

/*把数据库二维表存放到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)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求。键是字符串类型,值的类型目前支持的数据类型如下:

  1. 字符串类型
  2. 列表类型
  3. 集合类型
  4. 有序集合类型
  5. 散列类型

    官方测试数据: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值