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 (键不存在或者键本来就无过期时间)
- 使用set或getset命令为键赋值也会同时清除键的过期时间。
- 使用expire命令会重新设置键的过期时间。
- 其他只对键值进行操作的命令(如incr、lpush、hset、zrem)均不会影响键的过期时间。
- 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有关的数据发生增删改时,需要更新缓存,使得两种数据库的数据能够同步。