Redis

目的:利用Redis做数据缓存,缓存查询出来的对象数据。

NoSQL:Not Only SQL,非关系数据库。

关系型数据库指的是表结构存储,典型Oracle、MySQL、DB2。

  • key-value存储 : 典型Redis
  • 列存储 : HBase
  • 文档存储 : MongoDB
  • 图形存户:Neo4j

简介

  • Redis是基于内存的数据库,常用于缓存
  • Redis是采用C语言编写
  • Redis是采用Key-value结构存储
  • Redis中value值支持存储类型为字符串、哈希、列表、集合、可排序集合
  • Redis支持高速读写操作,效率高
  • Redis支持持久化、按一定策略将内存数据异步保存到磁盘
  • Redis支持事务控制、消息传递等功能

各种类型数据存储命令

  1. 字符串操作(string)

    • set key value //存一组key value
    • mset key value key value //存多组key value
    • get key //获取value
    • strlen key //获取value字符长度
    • incr key //将value加1
    • incrby key number //将value加number
    • decr key //将value减1
    • decrby key number //将value减number
    • append key value1 //将value拼接value1
  2. key操作

    • keys * //查看有哪些key
    • del key //删除key
    • expire key n //设置key有效期为n秒
    • rename key newkey //修改key名字
    • type key //返回value值得类型
    • exists key //判断key是否存在
  1. 哈希操作 (hashmap)

    • hset key 字段名 字段值 //设置一个字段名和字段值
    • hmset key 字段名1 字段值1 字段名2 字段值2 //设置多个
    • hget key 字段名 //获取一个字段值
    • hmget key 字段名1 字段名2 //获取多个字段值
    • hlen key //获取字段数量
    • hkeys key //获取字段名
    • hdel key 字段名 //删除某个字段
  1. 列表操作 (list)

    • lpush key value //在列表头部插入一个元素
    • rpush key value //在列表尾部插入一个元素
    • lrange key 0 -1 //获取列表所有元素
    • llen key //获取列表元素数量
    • lrem key count value //删除列表指定数量的元素
    • lset key index value //更新某个索引位置的元素
    • lindex key index //获取指定索引位置的元素
    • lpop key //删除列表头部第一个元素
    • rpop key //删除列表尾部最后一个元素
    • linsert key BEFROE|AFTER value newvalue //在列表value元素前或后插入newvalue值
  2. 集合操作 (set)

    A = {1,3,5}

    B = {3,5,7,9}

    A交B = {3,5}

    A并B = {1,3,5,7,9}

    A差B = {1}

    B差A = {7,9}

    • sadd key value value //向集合存数据
    • smembers key //获取集合所有元素
    • scard key //获取集合元素数量
    • srem key value //删除value元素
    • spop key //随机删除一个元素
    • srandmember key n //随机返回n个元素
    • sdiff key1 key2 //key1和key2集合的差集
    • sinter key1 key2 //key1和key2集合交集
    • sunion key1 key2 //key1和key2集合并集
    • sdiffstore key key1 key2 //key1和key2集合的差集,结果存放到key集合中
  1. 有序集合操作

    排序规则:给每个元素配一个double分值,按分值排序,默认由小到大排序。

    • zadd key score value score value //添加元素
    • zcard key //获取元素数量
    • zrange key 0 n //获取指定索引范围的元素,0 -1表示所有元素(由小到大排序)。
    • zrevrange key 0 n//根据score由大到小排序,获取指定索引的元素
    • zrem key value //删除某个元素
    • zscore key value //返回元素的分值
    • zrank key value //获取元素索引位置(由小到大排序)
    • zrevrank key value //获取元素索引位置(由大到小排序)
    • zcount key min max //统计分值在min和max之间的元素数量
  1. 其他

Java如何操作Redis存取数据

连接Redis

@Test//测试连接
public void test1(){
    Jedis jedis = new Jedis("localhost");
    System.out.println(jedis.ping());
}

字符串写操作

public void test2_1(){
    long i = 10000L;
    Jedis jedis = new Jedis("localhost");
    jedis.set("i", i+"");
    jedis.set("msg1", "Hello Redis");
    jedis.set("msg2".getBytes(), "你好 Redis".getBytes());
    jedis.close();
}

字符串读操作

public void test2_2(){
    Jedis jedis = new Jedis("localhost");
    String str = jedis.get("msg1");
    byte[] bts = jedis.get("msg2".getBytes());
    long i = Long.parseLong(jedis.get("i"));
    String str2 = new String(bts);
    System.out.println(str);
    System.out.println(str2);
    jedis.close();
}

其他类型存取操作请参考课上示例代码

Java如何利用Redis做缓存

  1. 对象存取方案

    • 将Java对象转成json字符串然后写入redis,取值时将json串转成Java对象
        @Test//写对象
        public void test1(){
            User user = new User();
            user.setId(10);
            user.setName("scott");
            user.setPassword("123");
            //写对象
            Jedis jedis = new Jedis("localhost");
            Gson gson = new Gson();
            String s = gson.toJson(user);
            jedis.set("user_"+user.getId(), s);
            jedis.close();
        }

        @Test//读对象
        public void test2(){
            int id = 10;
            Jedis jedis = new Jedis("localhost");
            String s = jedis.get("user_"+id);
            Gson gson = new Gson();
            User user = gson.fromJson(s, User.class);
            System.out.println(user.getId()+" "+user.getName());
            jedis.close();
        }


- 将Java对象序列化成字节数组然后写入redis,取值时反序列化成Java对象

        @Test//写对象
        public void test3(){
            User user = new User();
            user.setId(10);
            user.setName("scott");
            user.setPassword("123");
            //写对象
            Jedis jedis = new Jedis("localhost");
            //序列化
            byte[] value = SerializableUtil.serialize(user);
            jedis.set("user_10".getBytes(), value);
            jedis.close();
        }

        @Test//读对象
        public void test4(){
            int id = 10;
            String key = "user_"+id;
            Jedis jedis = new Jedis("localhost");
            byte[] value = jedis.get(key.getBytes());
            //反序列化
            User user = (User)SerializableUtil.unserialize(value);
            System.out.println(user.getId()+" "+user.getName()+" "+user.getPassword());
            jedis.close();
        }


10月      数据库

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!