说说Redis

最开始接触redis是因为session共享的问题,tomcat支持使用redis来共享session。至于什么是session共享,这里就不赘述了。

后来就没有在额外的使用过redis。而是学习了下redis的搭建,主备等。

在学习一个新的技术的时候,我们需要从两个角度学习。一个是使用,一个是运维。

先说redis的使用吧。为什么要用redis?最简单的一句话,为了查询起来快。只有查询快,用户体验才能好,只有查询快,并发压力才会小,系统就会更稳定。(不理解的自己想想去小超市购物结账的场景,如果收银台特别慢,超市里面堵得人就越多,直到超市挤不下人了。)

至于为什么redis查询这么快?那是因为人家是基于内存的的查询,再多的我也说不上来了,哈哈。

那我们知道用redis的目的了,那什么情况下可以用redis呢?

首先我们要知道redis里面可以为我们保存什么。

官网关于5中类型的介绍

string(字符串)、list(列表)、hash(字典)、set(集合) 和 zset(有序集合)

让我们借个图来说明下

光看数据类型是不是还是很懵?redis是怎么存储这些数据的?我们从使用角度来看下:

跟传统数据库一样,首先我们要链接redis

这个方式就很多了,简单点的可以直连:Jedis jedis = new Jedis("localhost"); 不过真的写代码的时候谁敢这么写,我分分钟拖他出去喂旺财。

比较规整的还是建立redis连接池:

//稍微标准点的工具类。放心,从网上找的代码,大家可以随便用,但是我可不管售后。
public class RedisUtil {

  //服务器IP地址

    private static String ADDR = "23.228.103.10";

  //端口

    private static int PORT = 6379;

  //密码

    private static String AUTH = "123456";

  //连接实例的最大连接数

    private static int MAX_ACTIVE = 1024;

  //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。

    private static int MAX_IDLE = 200;

    //等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException

    private static int MAX_WAIT = 10000;

  //连接超时的时间

    private static int TIMEOUT = 10000;

  // 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;

    private static boolean TEST_ON_BORROW = true;

    private static JedisPool jedisPool = null;

    /**

    * 初始化Redis连接池

    */

    static {

        try {

            JedisPoolConfig config = new JedisPoolConfig();

            config.setMaxTotal(MAX_ACTIVE);

            config.setMaxIdle(MAX_IDLE);

            config.setMaxWaitMillis(MAX_WAIT);

            config.setTestOnBorrow(TEST_ON_BORROW);

            jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH);

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    /**

    * 获取Jedis实例

    */

    public synchronized static Jedis getJedis() {

        try {

            if (jedisPool != null) {

                Jedis resource = jedisPool.getResource();

                return resource;

            } else {

                return null;

            }

        } catch (Exception e) {

            e.printStackTrace();

            return null;

        }

    }

    /***

    * 释放资源

    */

    public static void returnResource(final Jedis jedis) {

            if(jedis != null) {

                jedisPool.returnResource(jedis);

            }

    }

}

别小看这段代码,初学者可能都理解不了。简单说下,第一个知识点:static{} 静态代码块,在JVM加载类的时候会加载执行,只执行一次。第二个知识点:synchronized,这是同步锁,使用方式有很多,要是详细说,估计还要再开一章。这里大家主要理解为并发那连接的时候,不至于拿重复。

代码功底不是一日之功,小小的代码包含多少细节,愿与君共勉之。

说正题(敲黑板!!!)

获取到redis连接之后呢,我们就可以存放、读取、删除数据了。

继续上代码

public class TestRedis {

    private Jedis jedis;

    /**

    * 连接redis服务器

    */

    public void connectRedis() {

        jedis=RedisUtil.getJedis();

    }

    /**

    * redis操作字符串

    */

    public void testString() {

        //添加数据

        jedis.set("name", "youcong");

        System.out.println(jedis.get("name"));

        //拼接字符串

        jedis.append("name", ".com");

        System.out.println(jedis.get("name"));

        //删除数据

        jedis.del("name");

        System.out.println(jedis.get("name"));

        //设置多个键值对

        jedis.mset("name","yc","age","22","qq","1933108196");

        jedis.incr("age");//加1操作

        System.out.println(jedis.get("name") + "-" + jedis.get("age") + "-" +jedis.get("qq"));

    } 

    /**

    * redis操作map集合

    */

    public void testMap() {

        //添加数据

        Map<String,String> map = new HashMap<String,String>();

        map.put("name", "yc");

        map.put("age", "22");

        map.put("qq", "1933108196");

        jedis.hmset("user", map);

        //取出users中的Name,执行结果:[minxr]-->注意结果是一个泛型的List

        //第一个参数是存入redis中map对象的key,后面跟的是放入map中对象的key,后面的key可以是多个,是可变的

        List<String> rsmap = jedis.hmget("user", "name","age","qq");

        System.out.println(rsmap);

        //删除map中的某个键值

        jedis.hdel("user", "age");

        System.out.println(jedis.hmget("user", "age"));//因为删除了,所以返回的是Null

        System.out.println(jedis.hlen("user"));//返回key为user的键中存放的值的个数2

        System.out.println(jedis.exists("user"));//是否存在key为user的记录,返回true

        System.out.println(jedis.hkeys("user"));//返回map对象中的所有key

        System.out.println(jedis.hvals("user"));//返回map对象中的所有value

        Iterator<String> iter = jedis.hkeys("user").iterator();

        while(iter.hasNext()) {

            String key = iter.next();

            System.out.println(key+":" + jedis.hmget("user", key));

        }

    }


    /**

    * redis操作List集合

    */

    public void testList() {

        //开始前,先移除所有的内容

        jedis.del("java framework");

        System.out.println(jedis.lrange("java framework", 0, -1));

        //先向key java framework 中存放三条数据

        jedis.lpush("java framework","spring");

        jedis.lpush("java framework", "struts");

        jedis.lpush("java framework", "hibernate");

        //再取出所有数据jedis.lrange是按范围取出

        //第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有

        System.out.println(jedis.lrange("java framework", 0, -1));

    }



    /**

    * redis操作set集合

    *

    */

    public void testSet() {

        //添加

        jedis.sadd("user", "liuling");

        jedis.sadd("user", "xinxin");

        jedis.sadd("user","ling");

        jedis.sadd("user", "zhangxinxin");

        jedis.sadd("user", "who");

        //删除

        jedis.srem("user", "who");

        System.out.println(jedis.smembers("user"));//获取所有加入的value

        System.out.println(jedis.sismember("user", "who"));//判断who是否是user集合的元素

        System.out.println(jedis.srandmember("user"));

        System.out.println(jedis.scard("user"));//返回集合的元素个数

    }


    /**

    * redis排序

    */

    public void testSort() {

        //jedis 排序

        //注意,此处的rpush和lpush是List的操作。是一个双向链表(但从表现来看的)

        jedis.del("a");//先清除数据,再加入数据进行测试

        jedis.rpush("a", "1");

        jedis.lpush("a", "6");

        jedis.lpush("a", "3");

        jedis.lpush("a", "9");

        System.out.println(jedis.lrange("a", 0, -1));

        System.out.println(jedis.sort("a"));//[1,3,6,9] //输入排序后结果

        System.out.println(jedis.lrange("a", 0, -1));

    }

    /**

    * redis连接池

    */


    public void testRedisPool() {

        RedisUtil.getJedis().set("newname", "test");

        System.out.println(RedisUtil.getJedis().get("newname"));

    }

    public static void main(String[] args) {

        TestRedis test = new TestRedis();

        test.connectRedis();

        test.testSort();

    }

}

好像少了一个类型,Zset,也就是shortset。不过先这样吧,毕竟找的代码,凑活下先。

看到这里细心的同学会发下你,每次操作redis的数据之前,都有个key。也就是说,这个key相当于你建立的房子的名字,而数据value,则是房间内具体的内容。所以,我们常说redis是个key-value数据库。

好了,今天就到这里,以后继续更新。。。。



-----------------

我是一个拥有丰富经验的Copyer向架构师转型的小白。希望大家可以一起成长。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容