redis入门
一、概念
redis是一个key-value存储系统(也就是非关系型数据库)。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
redis应用场景
- 缓存(数据查询、短链接、新闻内容、商品内容等。。)
- 聊天室在线好友列表
- 任务队列(秒杀、抢购、等等)
- 应用排行榜
- 网站访问统计
- 数据过期处理
- 分布式集群架构中的session分离
二、命令操作
1、redis的数据结构:
redis存储的是key,value格式的数据,其中key都是字符串,而value有5种不同的数据结构
- 字符串类型string
- 哈希类型 map格式
- 列表类型 list 相当于java中的linkedlist格式(允许重复元素)
- 集合类型 set (不允许重复元素)
- 有序集合 sortedset ,(不允许重复元素)
2、字符串类型string
- 存储:
set key value - 获取:
get key - 删除:
del key
举例示范
① 存储key为age,value为23

② 查询key为age的value

③ 删除key为age的数据(先删除key为age的数据,然后再查询得到nil则表示删除成功)

3、哈希类型hash
- 存储:
hset key field value - 获取:
hget key field(获取某个指定的key的指定field的数据)
hgetall key(获取指定key的所有数据) - 删除:
hdel key field
举例示范
① 存储一个key为user ,flied为username ,value为zhangsan的数据

② 查询一个key为user,filed为username的数据的value

③ 删除一个key为user,filed为username的数据

④ 获取所有key为user的数据

4、列表类型
Redis列表是最简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部或者尾部,允许重复
- 添加
将元素添加到列表左边:lpush key value
将元素加入列表的右边:rpush key value - 获取:
lrange key start end(范围获取) - 删除:
lpop key(删除列表最左边的元素,并将元素返回)
rpop key(删除列表最右边的元素,并将元素返回)
这里解释一下列表存储数据的顺序问题

假设我们有一个列表叫做mylist,依次执行命令
lpush mylist a
lpush mylist b
rpush mylist c
由图所示,a先从左边加进来,然后b从左边加进来,加到了a的左边,然后c从右边加进来,得到最终mylist的数据的顺序就是bac
举例示范
① 从左边依次加入a和b,然后从右边加入c

查询列表中的数据为(0 -1 表示从开始到结尾)

② 删除左边的第一个元素,并且返回出来,得到的结果为

5、集合类型 set 不允许重复
- 存储:
sadd key value - 获取:
smembers key(获取set集合中所有元素) - 删除:
srem key value(删除set集合中的某个元素)
举例示范
① 无法存储重复的数据(interger表示影响是否成功 0失败 1成功)

② 存入和取出的顺序并不一定相同

6、有序集合
redis有序集合和集合一样也是string类型元素的集合,且不允许重复成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序,有序集合的成员是唯一的,但分数(score)却可以重复
- 存储:
zadd key score value - 获取:
zrange key start end - 删除:
zrem key value
7、通用命令
keys *获取所有key值type key查询指定key的类型del key删除指定key的数据
举例示范
① 存储数据它会默认按照core从小到大排列

三、持久化操作
redies是一个内存数据库,当redies服务器重启或者电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中
1、RDB持久化机制
默认方式,不需要进行配置,默认就是用这种机制,这种机制是在一定的间隔时间中,检测key的变化情况,然后持久化数据
持久化数据到一个以rdb为结尾的文件当中
redis.conf文件
save 900 1
save 300 10
save 60 10000
注释:
after 900 sec (15 min) if at least 1 key changed(十五分钟内又一个key发生改变,则进行一次持久化)
after 300 sec (5 min) if at least 10 keys changed(五分钟内又十个key发生改变,则进行一次持久化)
after 60 sec if at least 10000 keys changed(一分钟内又一万个key发生改变,则进行一次持久化)
2、AOF持久化机制
日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据
配置文件中的appendonly no默认为no表示关闭aof,改为yes就启动aof持久化操作了
还有一个配置:
① appendsync always:每次操作都进行持久化
② appendsync everysec:每隔一秒进行依次持久化
③ appendsync no:不进行持久化
四、使用java客户端操作redis
这里我们使用Jedis:一款java操作redis数据库的工具
1、使用步骤
- 创建和redis的连接
- 操作redis
- 关闭连接
举例示范

在执行该单元测试之前,redis中的keys都有如下这些

运行代码后,再次查询,得到

成功插入数据
2、Jedis操作各种redis中的数据结构
- 字符串类型string
- 哈希类型map
- 列表类型list
- 集合类型set
- 有序集合类型sortedset
jedis中操作数据的方法和redis中操作数据的方法类似
举例示范
jedis操作string类型的数据

注意:
- 创建jedis对象的时候,如果不指定ip地址和端口号,默认是本机ip地址,端口号默认是6379
- 存储string类型数据的方法是
jedis对象.set(key,value) - 获取string类型数据的方法是
jedis对象.get(key,value) jedis对象.setex(key,seconds,value)该方法的作用是:存储一对key,value按照传递进来的seconds,在seconds时间后删除这对key,value
jedis操作hash结构的数据

注意
- 存储hash类型数据的方法是
jedis对象.hset(key,filed,value) - 获取某个指定filed的值的方法是
jedis对象.hget(key,filed,value) - 获取指定key中的map集合内容的方法是
jedis对象.hgetAll(key,filed,value)
jedis操作列表类型的数据

注意
- jedis存储list类型数据的方法是
jedis对象.lpush(key,value)(从左边存);jedis对象.rpush(key,value)(从右边存)这里注意在redis2.4版本以前这个value都只能一个一个加入,高版本可以这样加,如jedis对象.rpush(key,value,value,value)这样 - jedis范围获取list类型的数据的方法是
jedis对象.lrange(key,start,end) - jedis弹出数据的方法是
jedis对象.lpop(key)(弹出左边的第一个数据);jedis对象.rpop(key)(弹出右边的第一个数据)
后面两种不做示范,操作方法和redis中的操作方法相同
2、Jedis连接池:JedisPool
使用步骤
- 创建JedisPool连接池对象
- 调用getResource()方法获取jedis连接
举例示范

JedisPoolConfig对象配置都有哪些?

3、Jedis工具类
public class JedisPoolUtils {
private static JedisPool jedisPool;
static {
URL resource = JedisPoolUtils.class.getClassLoader().getResource("jedis2.properties");
String path = resource.getPath();
Properties pro = new Properties();
try {
pro.load(new FileReader(path));
} 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();
}
}

浙公网安备 33010602011771号