redis

173 阅读6分钟

redis数据库

​ redis数据库是常用的nosql数据库之一,nosql(not only sql)类型的数据库也叫非关系型数据库,这种数据库从以下方面来说与关系型数据库存在一定区别。

  • 数据结构:关系型数据库(比如mysql、Oracle)中的数据可以是相互关联的,存在着外键等依赖关系。非关系型数据库中的数据是相互独立的,数据之间没有直接关系。
  • 数据存储:关系型数据库中的数据是持久化存储在硬盘上的,而非关系型数据库中的数据数存储在内存中的,所以非关系型数据库会存在少量的数据丢失问题。(redis也有持久化存储的方案)
  • 读取速度:关系型数据库在读写数据的时候会频繁的访问硬盘上的资源,速度慢,而非关系型数据库的数据是加载在内存中的,读取速度快,一般用来做缓存
  • 在redis数据库中,可以为数据设置过期时间,当数据过期之后会执行一定策略将数据删除。

redis数据库中的数据结构

​ 在redis数据库中,使用的是key value 的数据结构,其中key固定是String ,value可以是五种数据类型 :

  • Sting:字符串类型,具体实现是字符数组。
  • list:链表类型,具体实现是双向链表。
  • hash:hash表类型,表现为 field value 的键值对。
  • set:string类型的无序集合,其中的数据不允许重复
  • sorted set:string类型的有序集合,每个元素都会关联一个double类型的score(score可以重复),元素会根据score排序。

redis中的语法规则

​ 在redis中,5种数据结构都对应着不同的语法:

  • String:

    存入:set key value

    取出:get key

    删除:del key

  • list:

    存入: lpush key value:在链表左边添加一个元素

    ​ rpush key value:在链表右边添加一个元素

    取出: lrange key start end:在链表中取出下标为start到end的元素,0 -1代表取出所有元素

    删除: lpop key:移除并返回链表左边第一个元素

    ​ rpop key:移除并返回链表右边第一个元素

  • hash:

    存入:hset key field value

    取出:hget key field

    删除:hdel key field

  • set:

    存入:sadd key value

    取出:smembers key:返回set集合中所有成员

    删除:srem key member1 [member2...]:返回集合中一个或多个成员

  • sorted set:

    存入:zadd key score value

    取出:zrange key start stop [withscores]:返回集合中指定区间内的成员

    删除:zrem key member1 [member2...]:移除有序集合中一个或多个成员

  • 删除当前数据库中所有key:flushdb

  • 删除所有数据库中的key:flushall

  • 设置过期时间:

    expire key second:在second秒之后数据过期

  • 查询过期时间:

    ttl key:返回键的剩余时间,如果key不存在,则返回 -2 ,没有设置过期时间,返回 -1

  • 取消过期时间:

    persist key:取消键的过期时间设置,如果成功清除返回 1 ,否则返回 0 (键不存在或者键本来就无过期时间)

  1. 使用set或getset命令为键赋值也会同时清除键的过期时间。
  2. 使用expire命令会重新设置键的过期时间。
  3. 其他只对键值进行操作的命令(如incr、lpush、hset、zrem)均不会影响键的过期时间。
  4. expire命令的seconds参数必须是整数,所以最小单位是1秒。如果想要更精确的控制键的过期时间应该使用pexpire命令,单位是毫秒。对应的可以使用pttl命令查看键的剩余时间。
  • ==注意==:这里只列举了最基本的语法,具体的语法参见redis中文网

redis的持久化

​ redis的持久化指的是将redis在内存中的数据保存在硬盘中,从而达到数据的持久存储。现redis的持久化有两种策略,RDB和AOF。

RDB(默认方式)

​ RDB(快照)是通过设置redis.windows.conf文件中的参数,实现对redis的持久化

save 900 1		# 每900秒后如果对数据进行了至少一次改动,就会执行持久化
save 300 10		# 每300秒后如果对数据进行了至少10次改动,就会执行持久化
save 60  10000	# 每60秒后如果对数据进行了至少10000次改动,就会执行持久化

AOF

​ AOF(写命令)是通过设置redis.windows.conf文件中的配置,实现redis的持久化

appendonly no	# 默认关闭AOF
......
# appendfsync always	# 默认注释,每次操作都进行持久化
appendfsync everysec	# 每秒都进行持久化
# appendfsync no	 	# 不进行持久化 
  • ==注意==:以上两种持久化方式设置后,都要在命令行通过以下命令指定服务端按照配置文件的配置启动

  • D:\javadevelop\redis-2.8.9>redis-server.exe redis.windows.conf
    

Jedis

​ Jedis是一个java用来操作redis数据库的工具

Jedis的使用

  • jedis在使用前需要先导入jedis的坐标
  • 创建一个Jedis的对象,构造方法中传入ip和端口号
  • 直接使用Jedis对象的方法实现对redis数据库的操作
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Tuple;

import java.util.List;
import java.util.Map;
import java.util.Set;

class Test {
    public static void main(String[] args) {
        Jedis jedis=new Jedis("127.0.0.1",6379);//构造方法中指定ip地址和redis服务端的端口号

        //向redis中存入key为jedis,value为jString的String
        jedis.set("jedis","jString");//存入
        String string = jedis.get("jedis");//取出
        System.out.println(string);//jString
        jedis.del("jedis");//删除

        //测试list类型
        jedis.lpush("jlist","jvalue1");
        jedis.lpush("jlist","jvalue2");
        jedis.rpush("jlist","jvalue3");

        List<String> jlist = jedis.lrange("jlist", 0, -1);
        System.out.println(jlist);//[jvalue2, jvalue1, jvalue3]
        jedis.del("jlist");//删除

        //测试map类型
        jedis.hset("jmap","jedis1","jvalue1");
        jedis.hset("jmap","jedis2","jvalue2");
        jedis.hset("jmap","jedis3","jvalue3");

        Map<String, String> jmap = jedis.hgetAll("jmap");//
        System.out.println(jmap);//{jedis3=jvalue3, jedis1=jvalue1, jedis2=jvalue2}
        jedis.del("jmap");//删除

        //测试set类型
        jedis.sadd("jset","value1","value2");
        Set<String> jset = jedis.smembers("jset");
        System.out.println(jset);//[value1, value2]
        jedis.del("jset");

        //测试sorted set类型
        jedis.zadd("jsorted",70,"张三");
        jedis.zadd("jsorted",50,"李四");
        jedis.zadd("jsorted",90,"王五");
        Set<Tuple> jsorted = jedis.zrangeWithScores("jsorted", 0, -1);
        System.out.println(jsorted);//Tuple中有字节化的string和score属性
        jedis.del("jsorted");
    }
}

JedisPool(jedis连接池)

​ jedis连接池用于减少频繁创建销毁连接所消耗的时间,连接在用完之后close方法不会销毁连接,而是将连接归还。

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

class Test {
    public static void main(String[] args) {
        JedisPoolConfig config=new JedisPoolConfig();//连接池的配置类对象
        config.setMaxTotal(50);//最大连接数
        config.setMaxIdle(10);//最大空闲连接数
        //配置类中还有其他可以设置的参数,详见下文

        //创建连接池
        JedisPool jedisPool=new JedisPool(config,"localhost",6379);

        //获取连接
        Jedis jedis = jedisPool.getResource();

        //使用
        jedis.setex("name",10,"zhangsan");

        //归还连接
        jedis.close();
        jedisPool.close();//关闭连接池
    }
}
  • JedisPoolConfig配置类的配置
#最大活动对象数     
redis.pool.maxTotal=1000    
#最大能够保持idel状态的对象数      
redis.pool.maxIdle=100  
#最小能够保持idel状态的对象数   
redis.pool.minIdle=50    
#当池内没有返回对象时,最大等待时间    
redis.pool.maxWaitMillis=10000    
#当调用borrow Object方法时,是否进行有效性检查    
redis.pool.testOnBorrow=true    
#当调用return Object方法时,是否进行有效性检查    
redis.pool.testOnReturn=true  
#“空闲链接”检测线程,检测的周期,毫秒数。如果为负值,表示不运行“检测线程”。默认为-1.  
redis.pool.timeBetweenEvictionRunsMillis=30000  
#向调用者输出“链接”对象时,是否检测它的空闲超时;  
redis.pool.testWhileIdle=true  
# 对于“空闲链接”检测线程而言,每次检测的链接资源的个数。默认为3.  
redis.pool.numTestsPerEvictionRun=50  
#redis服务器的IP    
redis.ip=xxxxxx  
#redis服务器的Port    
redis1.port=6379   
  • ==注意==:redis一般用作缓存,当关系型数据库中和redis有关的数据发生增删改时,需要更新缓存,使得两种数据库的数据能够同步。