Redis
Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。是一款NOSQL系列的非关系型数据库
对于key-value的非关系数据库是比较适合做缓存的。那么Redis有什么用。比如当数据库中的某些数据是不经常改变的,这时就可以将这些数据存入到缓存中。当客户端读取数据时,可以直接从缓存中读取。从而减少了对数据库的访问。
Redis做缓存的流程和计算机的缓存差不多。当第一次查询数据时,发现缓存中没有数据,便从数据库读取数据。当从数据库读取到数据之后,将数据存入到redis中。下次读取数据时,便从redis缓存中直接读取
Redis是一个key-value型数据库,value所支持的类型有
1.string类型
2.hashmap类型
3.list类型
4.set类型
5.sortedset类型(有序集合)
环境搭建
http://www.redis.net.cn/ 官网下载
https://github.com/microsoftarchive/redis/releases github下载地址
redis.windows.conf:配置文件
redis-cli.exe:redis的客户端
redis-server.exe:redis服务器端
redis-benchmark:Redis性能测试工具
redis-stat:Redis状态检测工具
服务端窗口
客户端窗口
命令操作
1.通用命令
keys *
查询所有的建
type key
获取建所对的值的数据类型
del key
删除指定的key
2.字符串类型
1).存储数据
set key value
key是键名
value是值
2).获取数据
get key value
3).删除数据
del key
hashmap类型
1).存储数据
hset key field value
key是键名
field 是map的键名
value是值
2).获取数据
hget key field
获取Map中的某一个键的值
hgetall key
获取map的所有键和值
3).删除数据
hdel key field
删除map中的某一个field
list类型
可以从列表的头部或者尾部插入或删除
1).插入数据
lpush key value
从左边插入数据
rpush key value
从右边插入数据
插入时注意不能和之前的其他数据类型的key重复
2).获取数据
lrange key start end
获取某一范围到某一范围的值,
获取全部start为0,end为0
3).删除数据
lpop key
删除列表最左边的元素,并将元素返回
rpop key
删除列表最右边的元素,并将元素返回
set集合
set集合存储数据不允许重复元素
1).存储数据
sadd key value
插入数据到set集合中,若有相同数据不做操作
2).获取数据
smembers key
获取set集合的所有元素
3).删除数据
srem key value
删除set中的某一个值
sortedset类型
sortedset是有序集合
每个元素都会关联一个分数,来决定这排序顺序。
redis通过分数进行从小到大排序
1).添加数据
zadd key score value
添加一个数据到sorted set中
score是分数,它决定着排序的顺序。可以重复
2).获取数据
zrange key start end [withscores]
获取start到end范围内的元素
withscores表示是否在查询的时候携带值
3).删除数据
zrem key value
持久化
redis是一个内存数据库,当redis的服务器重启时,数据会丢失
之前存入的数据全部丢失
所以就需要持久化机制将redis内存中的数据存入硬盘中
redis持久化机制
1.RDB:默认的持久化方式。它的方式是在一定的时间内检测key的变化情况,然后持久化数据到硬盘中
2.AOF:日志记录方式
1.RDB方式
1).编辑redis.windwos.conf
有三个save
比如save 60 10000 表示着60秒后又10000个key发生变化时会持久化一次
假如更改为
2).重启redis服务器
打开cmd
redis-server.exe redis.windows.conf
以配置文件的方式启动服务器
3).存入数据
15秒后文件夹下回多出一个dump.rdb文件,这里就存在持久化的数据
4)测试
直接关闭服务器,再直接打开服务器
在客户端查询数据
获取成功
2.AOF方式
日志记录的方式
可以记录每一条命令的操作
可以每一次命令操作后,持久化数据
1).编辑redis.windwos.conf文件
appendonly no:关闭aof
appendonly yes :开启aof
更改为yes
appendfsync always : 每一次操作都进行持久化
appendfsync everysec : 每隔一秒进行一次持久化
appendfsync no : 不进行持久化
2).重启服务器
打开cmd
redis-server.exe redis.windows.conf
以配置文件的方式启动服务器
3).存入数据
文件夹下会多出一个aof的文件
4).测试
直接关闭服务器,再打开服务器
通过redis-server.exe redis.windows.conf
以配置文件的方式启动服务器
在客户端查询数据
java使用redis
1).环境搭建
java中使用redis需要导入Jedis的jar包
2)测试
@Test
public void test(){
Jedis jedis=new Jedis();
jedis.set("username","kryie");
jedis.set("password","123");
String username = jedis.get("username");
System.out.println(username);
}
java和redis客户端都可以获取到
操作数据
Jedis jedis=new Jedis();
先创建Jedis对象
操作数据通过Jedis对象调用方法,操作数据的方法和输入命令的命令名一致的
1).操作字符串
@Test
public void testString(){
Jedis jedis=new Jedis();
jedis.set("username","kryie");
jedis.set("password","123");
String username = jedis.get("username");
System.out.println(username);
jedis.close();
}
存入指定过期时间可以通过setex()方法
jedis.setex("username",60*60*24,"curry");
第二个参数是过期时间,单位是秒
jedis.del("username");
删除数据
2).操作hashmap
存入数据和获取数据
@Test
public void testHash(){
Jedis jedis=new Jedis();
jedis.hset("myhash","name","zhangsan");
jedis.hset("myhash","age","10");
String name = jedis.hget("myhash", "name");
System.out.println(name);
jedis.close();
}
获取全部
Map<String, String> myhash = jedis.hgetAll("myhash");
for (String key:myhash.keySet()) {
System.out.println(myhash.get(key));
}
删除数据
jedis.hdel("myhash","name");
3)操作list
存入和获取数据
@Test
public void testList(){
Jedis jedis=new Jedis();
jedis.lpush("mylist","r");
jedis.lpush("mylist","e");
jedis.rpush("mylist","y");
List<String> mylist = jedis.lrange("mylist", 0, -1);
System.out.println(mylist);
}
删除数据
String e1 = jedis.lpop("mylist");
String e2 = jedis.lpop("mylist");
String e3 = jedis.rpop("mylist");
4)操作set
@Test
public void testSet(){
Jedis jedis=new Jedis();
//添加数据
jedis.sadd("myset","name","lisi");
jedis.sadd("myset","sex","男");
//获取数据
Set<String> myset = jedis.smembers("myset");
System.out.println(myset);
//删除数据
jedis.srem("myset", "name"));
}
5).操作sortedset
@Test
public void testSortedSet(){
Jedis jedis=new Jedis();
//添加数据
jedis.zadd("mysort",50,"wangwu");
jedis.zadd("mysort",60,"zhangliu");
//获取数据
Set<String> mysort = jedis.zrange("mysort", 0, -1);
System.out.println(mysort);
//删除数据
jedis.zrem("mysort","wangwu");
}
JedisPool
jedis的连接池
@Test
public void testJedisPool(){
//获取连接池
JedisPool pool=new JedisPool();
//从连接池获取Jedis
Jedis jedis = pool.getResource();
//C存入数据
jedis.set("username","xiaoming");
//获取数据
String username = jedis.get("username");
System.out.println(username);
//关闭
jedis.close();
}
jedis.close()关闭,将jedis归还到连接池中
配置连接池
JedisPoolConfig config=new JedisPoolConfig();
config.setMaxIdle(10); //最大空闲数
config.setMaxTotal(50); //最大连接数
JedisPool jedisPool=new JedisPool(config,"localhost",6379);
//指定配置类,主机和端口
JedisPoolConfig连接池的配置类