zoukankan      html  css  js  c++  java
  • Redis之快速入门与应用[教程/总结]

    内容概要

    因为项目中用户注册发送验证码,需要学习redis内存数据库,故而下午花了些时间进行初步学习。本博文性质属于对今日redis学习内容的小结。在看本博文前或者看完后,可以反问自己三个问题:Redis是什么(What)、为什么要用Redis/Redis有什么用?(Why)、如何使用Redis(How)。

    • Redis简述
    • Redis安装与简单应用
    • Jedis(Redis for Java)
    • JedisPool(Jedis数据库连接池)
    • JedisUtil(Redis简易封装的操纵工具)
      • jedis.properties
      • pulic static Jedis getJedis()
      • public static void close(Jedis jedis)
    注:JedisUtil的设计及全部代码并非博主原创,系完全摘抄自博客园博主Roy-Xin的博文Jedis连接池

    一 Redis简述

    简述全文摘抄自百度百科

    • 特点
      • 支持网络[远程、分布式、主从模式]
      • 基于内存
      • 可持久化
      • 日志型
      • Key-Value数据库
      • 提供多种语言

    redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

    Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。

    Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

    二 Redis安装与简单应用

    • step2:解压即安装
    • step3:运行服务端
      • D:ProgramRedis edis-server.exe D:ProgramRedis edis.windows.conf # 运行redis服务器
    • step4.1:客户端调用Redis(应用)存储/获取数据[基于String的key-value键值对]
      • D:ProgramRedis edis-cli.exe -h 127.0.0.1 -p 6379 # 客户端调用redis服务
    >set myKey abc
    OK
    >get myKey
    "abc"
    
    • step4.2:密码问题
      • 查看当前redis有没有设置密码:(以下显示说明没有密码)
    127.0.0.1:6379> config get requirepass
    1) "requirepass"
    2) ""
    
    + 设置密码(方式一)
    
    127.0.0.1:6379> config set requirepass abcdefg
    OK
    
        + 再次查看当前redis就提示需要密码:
    
    127.0.0.1:6379> config get requirepass
    (error) NOAUTH Authentication required.
    
    + 设置密码(方式二:永久)
        + 打开配置文件 : redis.conf(假定设置为123)
    
    requirepass foobared
    requirepass 123
    
        + 保存后重启redis即可
    
    • step4.3:远程服务调用(需密码)
      • D:ProgramRedis edis-cli.exe -h <host:127.0.0.1> -p <port:6379> -a <password:123> # 客户端调用redis服务

    三 Jedis(Redis for Java)

    • jedis是官方首选的java客户端开发包
    • Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java、C、C#、C++、php、Node.js、Go等。
    • 在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis、等其中官方推荐使用Jedis和Redisson。
    • 在企业中用的最多的就是Jedis,Jedis同样也是托管在github上
    • 项目地址:https://github.com/xetorthio/jedis
    • 下载jedis解压后得到jar包如下:java操作redis数据库API(Jedis)
    • 基本用法
    //连接redis服务器,192.168.0.100:6379
    String ip="192.168.0.100";
    jedis = new Jedis(ip, 6379);
    //权限认证
    jedis.auth("password");
    
    
    public class RedisTest {
        @Test
        public void jedisPropertiesTest(){
            Jedis jedis = JedisUtil.getJedis();
            Print.print("ss: " + jedis.get("ss"));//output: ss:2423235
            JedisUtil.close(jedis);
        }
    
        @Test// 基于字符串存储的基本测试
        public void baseTest(){
            Jedis jedis = new Jedis("127.0.0.1",6379);
            jedis.auth("123456");
            //设置数据
            jedis.set("zengtai","1125418540");
            jedis.set("wangchen","2153253568");
            jedis.close();//释放资源
            Print.print("保存数据完成");
    
            //获取数据
            Print.print("ss: " + jedis.get("ss"));//output: ss:2423235
            Print.print("xx: " + jedis.get("xx"));//output: xx:bhdjfsahsf
            jedis.close();//释放资源
            Print.print("获取数据完成");
    
            //删除数据
            jedis.del("xx");
            jedis.close();//释放资源
            Print.print("删除数据完成");
            Print.print("xx: " + jedis.get("wangchen"));//output: xx:null
        }
    
        @Test//数据结构测试(栈/队列)
        public void dataStructureTest(){
            Jedis jedis = new Jedis("127.0.0.1",6379);
            jedis.auth("123456");
    
            //设置数据
            jedis.lpush("charsList","E","D","C","B");//添加List:B(0) C(1) D(2) E(3)
            jedis.lpush("charsList","A");//往key对应list左侧插入一个元素
            jedis.rpush("charsList","F");//往key对应list左侧插入一个元素
            Print.print("rpop:"+jedis.rpop("charsList"));//output: rpop:F
            Print.print("lpop:"+jedis.lpop("charsList"));//output: lpop:A
    
            Print.print("charsList[0]:"+jedis.lindex("charsList",0));//output: charsList[0]:B
            Print.print("charsList[1]:"+jedis.lindex("charsList",1));//output: charsList[1]:C
            jedis.lset("charsList",0,"<X>");//修改key对应list指定下标index的元素
            Print.print("charsList[0]:"+jedis.lindex("charsList",0));//output: charsList[0]:<X>
    
            jedis.close();//释放资源
        }
    }
    

    四 JedisPool(Jedis数据库连接池)

    + [【推荐(JedisUtil/连接池JedisPool)】Jedis连接池](https://www.cnblogs.com/xinruyi/p/9391140.html)
    
    //1 获得连接池配置对象,设置配置项
    JedisPoolConfig config = new JedisPoolConfig();
    // 1.1 最大连接数
    config.setMaxTotal(30);
    //1.2 最大空闲连接数
    config.setMaxIdle(10);
    //获得连接池
    JedisPool jedisPool = new JedisPool(config, "localhost", 6379);
    
    Jedis jedis = null;
    try {
        //3.获得核心对象
        jedis = jedisPool.getResource();
        //4.设置数据
        jedis.set("name", "xinruyi");
        //5.获得数据
        String name = jedis.get("name");
        System.out.println(name);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (jedis != null) {
            jedis.close();
        }
    }
    
    //虚拟机关闭时,释放pool资源
    if(jedisPool!=null){
        jedisPool.close();
    }
    

    五 JedisUtil(Redis简易封装的操纵工具)

    实现Redis操纵(JedisUtil类)所依赖的工具有:

    • Redis数据库服务
    • Jedis(Redis for Java - API)
      • jedis是官方首选的java客户端开发包
      • Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持
        • 比如 java、C、C#、C++、php、Node.js、Go等
      • 在官方网站里列一些Java的客户端,有Jedis、Redisson、Jredis、JDBC-Redis等
        • 其中,官方推荐使用Jedis和Redisson
      • 在企业中用的最多的就是Jedis,Jedis同样也是托管在github上
      • 地址:https://github.com/xetorthio/jedis
      • 下载jedis解压后得到jar包如下:java操作redis数据库API(Jedis)
    • JedisPool(Jedis连接池)
    • ResourceBundle(读取属性配置文件jedis.properties)
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
    
    import java.util.ResourceBundle;
    
    public final class JedisUtil {
        private JedisUtil() {
        }
    
        private static JedisPool jedisPool;
        private static int maxtotal;
        private static int maxwaitmillis;
        private static String host;
        private static int port;
        private static int timeout;
        private static String auth;//密码
    
        /*读取 jedis.properties 配置文件*/
        static {
            ResourceBundle rb = ResourceBundle.getBundle("jedis");
            maxtotal = Integer.parseInt(rb.getString("maxtotal"));
            maxwaitmillis = Integer.parseInt(rb.getString("maxwaitmillis"));
            host = rb.getString("host");
            port = Integer.parseInt(rb.getString("port"));
            auth = rb.getString("auth");
            timeout = Integer.parseInt(rb.getString("timeout"));
        }
    
        /*创建连接池*/
        static {
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            jedisPoolConfig.setMaxTotal(maxtotal);
            jedisPoolConfig.setMaxWaitMillis(maxwaitmillis);
            jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, auth);
        }
    
        /*获取jedis*/
        public static Jedis getJedis() {
            return jedisPool.getResource();
        }
    
        /**
         * 根据指定的分数据库索引[dabaseIndex],获取Redis分数据库
         * + 参考文献
         *   + [Redis 分库](https://www.cnblogs.com/DillGao/p/8494710.html)
         * + Redis 可以分库,相当于 MySQL 中的 database。
         * + 控制数据库总数在 redis配置文件中设置,默认是 16 个。
         * + 数据库名称是整数索引标识,而不是由一个数据库名称字符串。
         * + 选择数据库用 select 命令: redis>select 2
         * + reidis 中的操作,默认是 数据库 0;
         * + 每个数据库都有属于自己的空间,不必担心数据库之间的key冲突。
         * @param dabaseIndex
         * @return
         */
        public static Jedis getJedis(int dabaseIndex){
            Jedis jedis = jedisPool.getResource();
            jedis.select(dabaseIndex);
            return jedis;
        }
    
        /*关闭Jedis*/
        public static void close(Jedis jedis) {
            if (jedis != null) {
                jedis.close();
            }
        }
    }
    

    jedis.properties [jedis(redis for java)连接池配置信息]

    maxtotal=100
    maxwaitmillis=3000
    host=127.0.0.1
    port=6379
    auth=123456
    timeout=1000
    

    测试与示例

        @Test
        public void jedisPropertiesTest(){
            Jedis jedis = JedisUtil.getJedis();
            Print.print("aiqing: " + jedis.get("aiqing"));//output: aiqing:sdvwtrguyw32
            JedisUtil.close(jedis);//释放资源
        }
    

    六 参考文献

    七 推荐文献

  • 相关阅读:
    A. Greg and Array 夜
    zoj 2314 Reactor Cooling 夜
    sgu 104. Little shop of flowers 夜
    C. Greg and Friends 夜
    sgu 103. Traffic Lights 夜
    B. Greg and Graph 夜
    B. Yaroslav and Two Strings 夜
    zoj 2313 Chinese Girls' Amusement 夜
    sgu 101. Domino 夜
    hdu 4532 湫秋系列故事——安排座位 夜
  • 原文地址:https://www.cnblogs.com/johnnyzen/p/11105406.html
Copyright © 2011-2022 走看看