Redis入门


一、redis概念

概念:redis是一款高性能的NOSQL系列的非关系型数据库。

关系型数据库

1、数据之间有关联关系

2、数据存储在硬盘的文件

非关系型数据库

1、数据之间没有关联关系

2、数据存储在内存中

总结:一般会将数据库存储在关系型数据库中,在nosql数据库中备份存储关系型数据库的数据。

二、下载安装

1、下载网址:

官网:https://redis.io

中文网:http://www.redis.net.cn/

2、安装

# 解压
tar zxvf redis-4.0.10.tar.gz
# 编译测试
sudo make test
# 编译安装
sudo make install
# 启动redis服务端
redis-server
# 启动redis客户端
redis-cli

三、redis数据结构

redis存储的是(key,value)格式的数据,其中key都是字符串,value有5种不同的数据结构。

value的数据结构

  • 字符串类型 string
  • 哈希类型 hash(map格式)
  • 列表类型 list(linkedlist格式)
  • 集合类型 set
  • 有序集合类型 sortedset

四、命令操作

1、字符串类型 string

  • 存储:set key value
  • 获取:get key
  • 删除:del key
cyh@chenyonuandembp ~ % redis-cli
127.0.0.1:6379> set username zhangsan
OK
127.0.0.1:6379> get username
"zhangsan"
127.0.0.1:6379> del username
(integer) 1
127.0.0.1:6379> get username
(nil)

2、哈希类型 hash

  • 存储hset key field value
  • 获取

hget key field:获取指定的field对应的值

hgetall key:获取所以的field和value

  • 删除hdel key field
127.0.0.1:6379> hset myhash username lisi
(integer) 1
127.0.0.1:6379> hset myhash password 123
(integer) 0
127.0.0.1:6379> hget myhash username
"lisi"
127.0.0.1:6379> hget myhash password
"123"
127.0.0.1:6379> hgetall myhash
1) "password"
2) "123"
3) "username"
4) "lisi"
127.0.0.1:6379> hdel myhash username
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "password"
2) "123"
127.0.0.1:6379> 

3、列表类型 list(允许重复元素)

可以添加一个元素到列表的头部(左边)或者尾部(右边):类似于队列

  • 添加

lpush key value:将元素加入列表左边

rpush key value:将元素加入列表右边

  • 获取lrange key start end:范围获取
  • 删除

lpop key:删除列表最左边的元素,并将元素返回

rpop key:删除列表最右边的元素,并将元素返回

127.0.0.1:6379> lpush mylist a
(integer) 1
127.0.0.1:6379> lpush mylist b
(integer) 2
127.0.0.1:6379> lpush mylist c
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> lpop mylist
"c"
127.0.0.1:6379> rpop mylist
"a"
127.0.0.1:6379> lrange mylist 0 -1
1) "b"
127.0.0.1:6379> lpush mylist c d e
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "e"
2) "d"
3) "c"
4) "b"

4、集合类型 set(不允许重复元素)

  • 存储:sadd key value

  • 获取:smembers key(获取set集合中所以元素)

  • 删除:srem key value

127.0.0.1:6379> sadd myset a b c d
(integer) 4
127.0.0.1:6379> smembers myset
1) "d"
2) "a"
3) "c"
4) "b"
127.0.0.1:6379> srem myset a
(integer) 1
127.0.0.1:6379> smembers myset
1) "d"
2) "c"
3) "b"

5、有序集合类型 sortedset(不允许重复元素,且元素有顺序)

  • 存储:zadd key score value

  • 获取:zrange key start end

  • 删除:zrem key value

127.0.0.1:6379> zadd mysort 60 zhangsan
(integer) 1
127.0.0.1:6379> zadd mysort 40 li
(integer) 1
127.0.0.1:6379> zadd mysort 40 li
(integer) 0
127.0.0.1:6379> zadd mysort 80 wangwu
(integer) 1
127.0.0.1:6379> zrange mysort 0 -1
1) "li"
2) "zhangsan"
3) "wangwu"
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "li"
2) "40"
3) "zhangsan"
4) "60"
5) "wangwu"
6) "80"
127.0.0.1:6379> zrem mysort li
(integer) 1
127.0.0.1:6379> zrange mysort 0 -1
1) "zhangsan"
2) "wangwu"
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "zhangsan"
2) "60"
3) "wangwu"
4) "80"

6、通用命令

  • keys *:查询所有的键

  • type key:获取键对应的value的类型

  • del key:删除指定的key value

127.0.0.1:6379> keys *
1) "myhash"
2) "mylist"
3) "myset"
4) "mysort"
5) "username"
127.0.0.1:6379> type mylist
list
127.0.0.1:6379> del username
(integer) 1
127.0.0.1:6379> keys *
1) "myhash"
2) "mylist"
3) "myset"
4) "mysort"

五、持久化

1、解释

redis是一个内存数据库,当redis服务重启,数据就会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中。

2、redis持久化机制

ROB:默认方式,不需要进行配置,默认使用这种机制。
(在一定的时间间隔中,检测key的变化情况,然后持久化数据)

  • 编辑redis.conf文件

    save 900 1
    save 300 10
    # save 60 10000
    save 10 5
  • 重新启动redis服务器,并指定配置文件名称

    cyh@chenyonuandembp redis-5.0.4 % redis-server redis.conf 
  • AOF*:日志记录的方式,可以记录每一条命令的操作,可以每一次命令操作后,持久化数据

  • 编辑redis.conf文件

    # appendonly no(关闭aof)
    appendonly yes (开启aof)
    # appendfsync always (每一次执行都进行持久化)
    appendfsync everysec (每隔一秒进行一次持久化)
    # appendfsync no (不进行持久化)
  • 重新启动redis服务器,并指定配置文件名称

    cyh@chenyonuandembp redis-5.0.4 % redis-server redis.conf 

六、java客户端 Jedis

1、Jedis介绍

一款java操作redis数据库的工具。

2、使用步骤

  • 下载jedis的jar包
  • 使用
    // 1. 获取连接
    Jedis jedis = new Jedis("localhost",6379);
    // 2. 操作
    jedis.set("username","wangwu");
    // 3. 关闭连接
    jedis.close();

3、jedis操作各种redis中的数据结构

(1)jedis的string操作

    @Test
    public void stringTest() {
        // 如果使用空参构造,则默认值为"localhost", 6379端口
        Jedis jedis = new Jedis();
        // string存储
        jedis.set("name", "wangWu");
        // 获取
        String username = jedis.get("name");
        System.out.println(username);
        // 可以使用setex()f方法存储可以指定过期时间的key,value
        // activecode:1234键值对存入redis,并且20秒后自动删除该键值对(可以用于验证码)
        jedis.setex("activecode", 20, "1234");
        jedis.close();
    }

(2)jedis的hash操作

@Test
    public void hashTest() {
        Jedis jedis = new Jedis();
        jedis.hset("user", "name", "Mary");
        jedis.hset("user", "age", "24");
        jedis.hset("user", "gender", "male");
        String age = jedis.hget("user", "age");
        System.out.println(age);
        Map<String, String> map = jedis.hgetAll("user");
        Set<String> keys = map.keySet();
        for (String key : keys) {
            String value = map.get(key);
            System.out.println(key + ":" + value);
        }
        jedis.close();
    }

输出:

24
name:Mary
gender:male
age:24

(3)jedis的list操作

@Test
    public void listTest() {
        Jedis jedis = new Jedis();
        jedis.lpush("list", "a","b","c");
        jedis.rpush("list", "a","b","c");
        List<String> list = jedis.lrange("list", 0, -1);
        System.out.println(list);
        String r1 = jedis.lpop("list");
        System.out.println(r1);
        String r2 = jedis.rpop("list");
        System.out.println(r2);
        List<String> list2 = jedis.lrange("list", 0, -1);
        System.out.println(list2);
        jedis.close();
    }

输出:

[c, b, a, a, b, c]
c
c
[b, a, a, b]

(4)jedis的set操作

@Test
    public void setTest() {
        Jedis jedis = new Jedis();
        jedis.sadd("set", "php","java","c","python");
        Set<String> key = jedis.smembers("set");
        System.out.println(key);
        jedis.srem("set", "c");
        jedis.close();
    }

(5)jedis的sortedset操作

@Test
    public void sortTest() {
        Jedis jedis = new Jedis();
        jedis.zadd("sort", 23, "张三");
        jedis.zadd("sort", 37, "李四");
        jedis.zadd("sort", 16, "王五");
        Set<String> sort = jedis.zrange("sort", 0, -1);
        System.out.println(sort);
        jedis.zrem("sort", "张三");
        jedis.close();
    }

七、Jedis连接池

1、Jedis连接池

 @Test
    public void jedisPoolTest() {
        // 创建一个配置对象
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        // 最大允许连接数
        jedisPoolConfig.setMaxTotal(50);
        // 最大空闲连接
        jedisPoolConfig.setMaxIdle(10);
        // 创建jedis连接池对象
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, "localhost", 6379);
        // 获取连接
        Jedis jedis = jedisPool.getResource();
        // 使用
        jedis.set("like", "sport");
        // 归还到连接池中
        jedis.close();
    }

配置文件详情:
配置文件

2、Jedis连接池工具类

  • JedisPoolUtils工具类

    package jedis.util;
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.Properties;
    /**
    * @Author: cyh
    * @Date: 2020-02-13 21:37
    * @Description: Jedis连接池工具类
    **/
    public class JedisPoolUtils {
    
      private static JedisPool jedisPool;
    
      static {
          InputStream is = JedisPoolUtils.class.getClassLoader().getResourceAsStream("jedis.properties");
          Properties pro = new Properties();
          try {
              pro.load(is);
          } catch (IOException e) {
              e.printStackTrace();
          }
          JedisPoolConfig config = new JedisPoolConfig();
          config.setMaxTotal(Integer.parseInt(pro.getProperty("maxTotal")));
          config.setMaxIdle(Integer.parseInt(pro.getProperty("maxIdle")));
          jedisPool = new JedisPool(config, pro.getProperty("host"), Integer.parseInt(pro.getProperty("port")));
      }
    
      /**
       * 获取连接方法
       * @return
       */
      public static Jedis getJedis() {
          return jedisPool.getResource();
      }
    }
  • jedis.properties配置类
    host=127.0.0.1
    port=6379
    maxTotal=50
    maxIdle=10
  • 测试
    @Test
      public void jedisPoolUtilsTest() {
          Jedis jedis = JedisPoolUtils.getJedis();
          // 使用
          jedis.set("hello", "world");
          // 归还到连接池中
          jedis.close();
      }

    注意:使用redis缓存一些不经常发生变化的数据。如果数据库的数据一旦发生改变,则需要更新缓存。当数据库中的表执行增删改的操作时,需要修改redis缓存数据情况,先在service对应的增删改方法中,将redis删除,然后再次存入。


评论
评论
  目录