redis数据库
1.Redis的安装
可以直接去中文官网中直接下载安装,进入这个网站,点击下载,下载稳定版的即可。将该tar包下载后加压到一个没有中文字符路径的空文件夹中,即可直接使用,不用进行额外的配置。本地使用方式如下:
- 打开redis-server.exe:这是一个redis的服务器端,相当于mysql软件
- 打开redis-cli.ext:这是一个redis的客户端,可以供我们在本地操作redis数据库,类似与图形化界面,当然这里是使用命令行的方式操作redis数据库的。
例如:在redis-cli客户端中保存键为“name",值为”zhangsan"的一条数据,并获取该数据(相当于name=zhangsan)
2.Redis的数据结构
Redis底层是由C语言编写的,redis里面内置的数据结构即是用C语言的结构体实现的。redis的数据结构有以下5种。
值得说明的是这里的数据结构指的是值的类型,redis的键都是有字符串构成的。
2.1数据结构分类
- string:字符串类型;
- hash:哈希类型,相当于map类型,值也是以键值对的形式存在的;
- list:列表类型,可以支持重复性的数据;
- set:集合类型,与list的区别是不支持重复性的数据;
- sortedset:有序集合类型,在不支持重复的同时还保证数据是有序的。
2.2各种数据结构常用的命令操作
string
-
存储数据:
set key value
-
取出数据:
get key
-
删除键:
del key
127.0.0.1:6379> set username zhangsan // 设置username的值为zhangsan
127.0.0.1:6379> get username //取出username对应的值
"zhangsan"
127.0.0.1:6379> del username //username的值将会被删除
hash类型
-
存储数据:
hset key field value
即创建一个类型为hash,其键为key,里面有个字段为field,值为value,相当于{“key”: {“filed”:value}}
-
取出数据:
hget key field
获取字段field中的值
-
取出hash中键值key的所有的字段数据:
hgetall key
将会获取键值对,field=value
-
删除字段:
hdel key field
删除键key的字段field
127.0.0.1:6379> hset person name zhangsan
127.0.0.1:6379> hset person age 21
// 即相当于创建了:person = {"name":"张三", "age":21}
127.0.0.1:6379> hget person name
"zhangsan"
127.0.0.1:6379> hgetall person
"name"
"zhangsan"
"age"
21
127.0.0.1:6379> hdel person name // 删除字段name
list类型
可以选择将一个元素添加到头部还是到尾部,很像一个双端队列结构
-
存储数据:
lpush key value //将数据从左边添加到列表中
rpush key value //将数据从右边添加到列表中
-
取出数据:
lrange key start end
将start到end范围的索引的数据取出,从0开始,-1表示后一个元素
-
删除数据:
lpop key //删除列表中最左边的元素,并将元素返回
rpop key //删除列表中最右边的元素,并将元素返回
127.0.0.1:6379>lpush userlist zhangsan
127.0.0.1:6379>rpush userlist lisi
127.0.0.1:6379>lrange userlist 0 -1 //取出列表中所有的元素
"zhangsan"
"lisi"
127.0.0.1:6379>lpop userlist
"zhangsan"
127.0.0.1:6379>rpop userlist
"lisi"
set类型
与list类型类似,但是不会添加重复数据
-
存储数据:
sadd key value
-
获取数据:
smembers key
取出所有的值
-
删除数据:
srem key value
127.0.0.1:6379>sadd myset a //给myset中添加"a"
127.0.0.1:6379>sadd myset b
127.0.0.1:6379>smembers myset
"a"
"b"
127.0.0.1:6379>srem myset a //删除a的值
sortedset类型
有序集合类型,不允许重复数据,存储数据时要为每个值设置一个double类型的score(分数)用来排序
-
存储数据:
zadd key score value
-
取出数据:
zrange key start end [withscores]
可选的withscores表示是否要将分数一起展示出来,起始索引下标为0,-1表示最后一个元素
-
删除数据:
zrem key value
127.0.0.1:6379> zadd mysort 60 zhangsan //值zhangsan的score为60
(integer) 1
127.0.0.1:6379> zadd mysort 50 lisi //值lisi的score为50
(integer)1
127.0.0.1:6379> zadd mysort 80 wangwu //值wangwu的score为80
(integer) 1
127.0.0.1:6379> zrange mysort 0 -1
1) "lisi"
2) "zhangsan"
3) "wangwu"
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "zhangsan"
2) "60"
3) "wangwu"
4) "80"
5) "lisi"
6) "500"
127.0.0.1:6379> zrem mysort lisi //删除lisi的值
(integer) 1
2.3其他通用命令操作
- keys * :查询所有键,可以使用正则表达式的方式
- type key:查询该键的类型
- del key:删除指定的键
3.Redis的持久化操作
reids常用于缓存操作,其数据是保留在内存当中,因此随着程序的关闭的,其数据就会丢失。但是我们可以使用持久化的技术将redis内存中的数据持久化到我们本地的硬盘文件中。
redis有RDB和AOF这两种持久化机制,默认使用的是RDB这种持久化机制。
3.1RDB
这是redis默认的持久化机制,一种快照存储的方式,具体会在某个时刻监测key的变化,如果有变化的话就会写入到本地文件中,默认保留的本地文件问dump.rdb,在你redis解压目录即可查看。当redis服务器重新启动时,就会加载dump.rdb文件中的数据进内存中。
配置监测key变化的时间间隔
redis的配置文件都在redis.windows.conf文件中,关于保存数据的时间间隔的配置在如下位置:
save 900 1 如果900秒(15分钟)后有一个键的值发生变化,则持久化一次
save 300 10 如果300秒(5分钟)后有10个键的值发生变化,则持久化一次
save 60 10000 如果60秒后有10000个键的值发生变化,则持久化一次
这是官方默认的配置,可以根据需要配置。在配置之后重新启动redis服务端。
3.2AOF
这是一种日志记录的方式,可以用于记录每一条数据的变化,在每一个键发生变化的时候持久化一次内存中的数据。redis.windows.conf文件与AOF相关的配置在:
这里默认是关闭AOF这种持久化机制:appendonly no;如果要开启的话只需将no改成yes即可。之后再配置:
这里是用来配置AOF持久化的频率
appendfsync always 每一次操作都持久化一次
appendfsync everysec 每一秒持久化一次
appendfsync 不进行持久化
4.java操作Redis
java使用Jedis工具来操作redis数据库。如果还没有下载Jedis相关的jar的话,可以到这里下载。或者如果是使用maven的话,可以在pom.xml配置如下引入相关依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.1</version>
</dependency>
(版本号可以选择自己想要)
4.1使用方式
Jedis的使用非常简便,只要创建对应的Jedis对象即可。
Jedis jedis = new Jedis("localhost", 6379); //连接本地的Jedis数据库,无参构造的话默认就是这两个值 注意要将本地的redis服务端打开
jedis.set("name", "zhangsan"); //设置一个字符串类型的数据 name=zhangsan
jedis.get("name"); // zhangsan
jedis中对数据操作的那些方法的方法名是和上面将的redis中的命令是一致的,只是Jedis中命名是驼峰命名,有一些名称可能要区分一下大小写。例如
jedis.hset("user", "name", "zhangsan"); //设置一个map数据
jedis.hset("user", "age", "22");
jedis.hget("user", "name");
jedis.hgetAll("user");
可见其使用方式和命名行的使用方式是类似的,只不过把数据当成参数进行传递,就不在这里过多赘述了。
其他方法:
jedis.close(); //关闭连接
jedis.setex(String key, int seconds, String value); //设置seconds秒数之后自动删除该键值对
4.2连接池
与mysql类似的,redis也有一个数据连接池对象为JedisPool,下面创建一个redis数据库连接的工具类,用于获取JedisPool连接池和获取Jedis连接对象。
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public final class JedisUtil {
/**
* JedisPool连接池对象
*/
private static JedisPool jedisPool;
static {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(50); //最大连接数,设置为0表示没有限制
config.setMaxIdle(10); //最大等待的连接数,设置为0表示没有限制
jedisPool = new JedisPool(config, "localhost", 6379);
}
/**
* 获取Jedis连接对象
*/
public static Jedis getJedis() {
return jedisPool.getResource();
}
/**
* 关闭jedis连接
*/
public static void close(Jedis jedis) {
if (jedis != null) {
jedis.close();
}
}
}
5.概念补充
Redis(Remote Dictionary Server),即远程字典服务,是一款有C语言开发的,高性能的NOSQL系列的存储键值对类型的数据库。
NoSQL:not only sql,不仅仅是sql,指的是一种非关系型数据库,区别于mysql这种关系型数据库,能够处理大规模的数据和高并发的场景。
注意redis并不是用来替代关系型数据库,是用来在某些特定的场合下能和关系型数据库相互补充。例如,在一些需要频繁从数据库获取相同的数据的场合中,在第一次读取数据时,可以先将数据从mysql读取,同时保存在redis数据库中,之后再读取时直接从redis数据库中读取。
5.1常用的NoSQL系列的数据库
键值对系列
- 相关产品:Redis, Voldemort, Berkeley DB等
- 使用场景:内容缓存,主要用于处理大量数据的高访问负载为题。
- 数据存储类型:键值对,key-value,value是非结构化的。
列存储数据库
- 相关产品:HBase,Riak,Cassandra
- 使用场景:分布式的文件系统
- 数据存储类型:以列簇式存储,将一列数据放在一起
文档型数据库
- 相关产品:MongoDB, CouchDB
- 使用场景:web应用
- 数据存储类型:一系列键值对,与key-value类似,但是value是结构化的。
图形数据库
- 相关产品:Noe4J, InfoGrid, Infinite Graph
- 使用场景:社交网络
- 数据存储类型:图结构
5.2 Redis的使用场景
- 缓存:数据查询,新闻内容,短连接,商品内容, 可以让数据只从关系型数据库中获取一次,之后从缓存中获取将会大大加快速度
- 聊天室在线好友列表
- 任务队列,例如秒杀操作,抢购(12306)
- 排行榜
- 网站访问统计
- 数据过期处理,可以精确到毫秒值
- 分布式集群架构中的session分离
放在一起
文档型数据库
- 相关产品:MongoDB, CouchDB
- 使用场景:web应用
- 数据存储类型:一系列键值对,与key-value类似,但是value是结构化的。
图形数据库
- 相关产品:Noe4J, InfoGrid, Infinite Graph
- 使用场景:社交网络
- 数据存储类型:图结构
5.2 Redis的使用场景
- 缓存:数据查询,新闻内容,短连接,商品内容, 可以让数据只从关系型数据库中获取一次,之后从缓存中获取将会大大加快速度
- 聊天室在线好友列表
- 任务队列,例如秒杀操作,抢购(12306)
- 排行榜
- 网站访问统计
- 数据过期处理,可以精确到毫秒值
- 分布式集群架构中的session分离