Redis缓存技术总结

来源:互联网 发布:鬼 知乎 编辑:程序博客网 时间:2024/05/22 05:12

NoSQL和关系型数据库区别

NoSQL非关系型数据库:Redis、MongoDB、HBase等,基于Key-Value存储,采用命令操作

关系型数据库:Oracle、MySQL、DB2、SQLServer等,基于表结构存储,采用SQL操作

Redis

redis是一个key-value存储的非关系型数据库。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。

Redis特点

  • 采用C语言编写,基于内存操作,被称为内存数据库
  • 存储的数据结构是key-value结构,value值可以为字符串、哈希、列表、集合、有序集合结构。
  • Redis的存取速度异常快
  • Redis支持持久化操作,将内存数据同步到数据文件中
  • Redis还提供了事务、消息传递等功能

    在系统中,通常使用Redis做数据缓存使用。
    查询缓存:第一次从数据库取出放入缓存,然后后续都从缓存取出数据。

    添加/更新缓存:将用户数据通过检测后放入缓存,然后给用户响应,后台开启线程取数据处理。

  1. Redis操作命令

    • 字符串操作

      set key value //设置value值get key //获取value值strlen key //获取value长度incr key //将value加1incrby key i  //将value加idecr key  //将value减1decrby key i //将value减iappend key value //将原有key的值拼接上value值
    • key操作

      keys pattern //查看keydel key   //删除keyexpire key time  //设置有效时间(秒)type key //判断value值类型rename key newkey //修改key名称
    • 哈希操作(Java中的Map)

      hset key 字段名 字段值  //设置一组hmset key 字段名 字段值 字段名 字段值 //设置多组hget key 字段名  //获取一个字段值hmget key 字段名1 字段名2 //获取多个字段值hlen key //获取字段数量hkeys key //查看字段名hdel key 字段名  //删除字段名
    • 列表操作(Java中List)

      lpush key value //从头部放入值(key列表存在插入,不存在创建列表插入)rpush key value //从尾部放入值lpop key //从头部删除一个元素rpop key //从尾部删除一个元素lrem key count value //删除多少个值等于value的元素lindex key index //获取index位置的value值lrange key start end //获取指定范围的元素linsert key before|after 元素 要插入的值 //插入元素lset key index value //更新index位置的value值llen key //获取列表元素数
    • 集合操作(Java中Set)

      sadd key value value //向集合添加元素srem key value //删除value元素scard key  //获取集合元素数量smembers key //查看所有元素srandmember key count //获取count个随机数sinter key1 key2 //两个集合交集,key1和key2都有sunion key1 key2 //两个集合并集,去重复合并sdiff key1 key2 //差集,key1有,key2没有
    • 有序集合

      zadd key score value //向集合添加元素zrem key value //删除元素zcard key //元素数量zrange key start end //获取指定范围的元素(小到大)zrevrange key start end //获取指定范围的元素(大到小)zrevrank key value //获取value索引(大到小)zrank key value ////获取value索引(小到大)

4. Java对Redis操作

- 引入驱动包jedis.jar- 之后建立连接,对Redis操作- 释放连接资源**示例代码**
        public void test2(){            Jedis jedis = new Jedis("localhost");            jedis.set("msg", "java msg");//set key value            String str = jedis.get("msg");//get key            System.out.println(str);            jedis.close();//有些版本jar包没有该方法        }

5. 对象存取操作(基于JSON字符串存取)

  • 将Java对象转成JSON字符串写入Redis
public void test1(){                Emp emp = new Emp();                emp.setEmpno(100);                emp.setEname("ROSE");                emp.setSal(20000.0);                emp.setJob("Programming");                emp.setDeptno(10);                //将emp转成json字符串                Gson gson = new Gson();                String jsonStr = gson.toJson(emp);                Jedis jedis = new Jedis("localhost");                jedis.set("emp_100", jsonStr);                jedis.close();            }
  • 将JSON字符串从Redis取出转成Java对象
            public void test2(){                Jedis jedis = new Jedis("localhost");                String jsonStr = jedis.get("emp_100");                //将json字符串转成emp                Gson gson = new Gson();                Emp emp = gson.fromJson(jsonStr, Emp.class);                System.out.println(emp.getEmpno()+" "+emp.getEname()+" "+emp.getJob());                jedis.close();            }

6. 对象存取操作(基于序列化存取)

  • 将对象序列化存储
            public void test1_1(){                Emp emp = new Emp();                emp.setEmpno(101);                emp.setEname("JACK");                emp.setSal(20000.0);                emp.setJob("Programming");                emp.setDeptno(10);                //将emp对象序列化成byte[]                byte[] bts = SerializeUtil.serialize(emp);                Jedis jedis = new Jedis("localhost");                jedis.set("emp_101".getBytes(), bts);                jedis.close();            }
  • 反序列化获取
public void test2_1(){                Jedis jedis = new Jedis("localhost");                byte[] bts = jedis.get("emp_101".getBytes());                //将byte数组转成emp对象                Emp emp = (Emp)SerializeUtil.unserialize(bts);                System.out.println(emp.getEmpno()+" "+emp.getEname()+" "+emp.getJob());                jedis.close();            }

7. 分页缓存

思路:将每一个页记录使用Redis列表存储。为了保持同步性增删改操作需要做如下处理

  • 删除:需要清除Redis中当前页,后续页缓存
  • 更新:需要清除Redis中当前页缓存
  • 添加:需要清除所有页缓存

redis常用五种数据类型:string,hash,list,set,zset(sorted set).

String:是最简单的类型,一个key对应一个value List类型:链表类型,主要功能是push、pop、获取一个范围的所有值等。
Set类型:集合,和数学中的集合概念相似。

ZSet(Sorted Set)类型
在set的基础上增加了一个顺序属性,这一属性在添加修改元素时可以指定,每次指定后zset会自动安装指定值重新调整顺序。可以理解为一张表,一列存value,一列存顺序。操作中的key理解为zset的名字。

hash类型 hash是最接近关系数据库结构的数据类型,可以将数据库一条记录或程序中一个对象转换成hashmap存放在redis中。

原创粉丝点击