redis
redis
redis是什么
reids的下载和安装
redis的数据类型
redis的常用命令
java去操作redis(jedis)
redis是什么
redis是一款高性能的nosql系列的非关系型数据库
nosql是什么?
not only sql,不仅仅是sql,这是一种新的数据库理念,泛指非关系型数据库
redis最开始设计出来的时候并不是用来作为数据库的,而是用作缓存服务器使用的,也是目前世界上最流行的缓存服务器之一,随着redis的发展才开始作为数据库使用的。
缓存:
在计算机中可以用来存储数据的地方:数据库、硬盘、内存,这其中只有数据库和硬盘可以持久化数据,内存是无法持久化数据的。但是内存的读写比硬盘和数据库快很多。缓存主要是为了提升用户的体验。比较常见的就是将数据库或者硬盘中的数据加载到内存中,然后只需要操作内存中的数据即可,需要定期将内存中的数据持久化到数据库或者硬盘即可。
常见的缓存服务器:redis、memorycached
nosql的产生原因
随着web2.0时代网站的兴起,传统的关系型数据库是无法满足web2.0时代大型网站的需求,特别是超大规模和高并发的网站,为了克服这个问题,选择非关系型数据库,因为非关系型数据库的特点能够满足超大规模和高并发的需求,所以redis得到了迅猛的发展。所以现在建立一个超大规模的网站,选择redis这种非关系型数据库是必须的。
nosql和关系型数据库的比较
优点:
成本:nosql基本上都是开源的,关系型数据库比如oracle这种需要花费大量的成本去购买使用
查询效率: nosql的数据存在于缓存中,关系型数据库是存在于硬盘中,nosql的查询效率更高
存储方式:nosql主要以k-v方式或者文档方式,所以支持的数据类型更强大,可以直接存储:基本数据类型、对象、集合等。关系型数据库能够存储一些基本的数据类型
扩展性:关系型数据库的扩展性更差一些
缺点:
新的技术,文档和维护的工具更少
不提供sql的支持,开发者需要花费更多的学习成本
不提供关系型数据库的事务管理
总结:
nosql和关系型数据库不是对立关系,而是互补的关系。一般情况下还是会继续使用关系型数据库,在需要使用nosql的时候,去添加nosql数据库,让nosql数据库针对关系型数据库的不足进行弥补,一般数据最终还是会存在于关系型数据库中,nosql数据库中会有一个备份
常见的nosql产品:
k-v形式: redis 优势:快速 劣势:存储的数据不是结构化的
列存储模式: HBase 主要应用在大数据的环境下 优势:查询效率很高,可扩展性强 劣势:功能相对局限
文档型: mongdb 与k-v类似 v是结构化的数据 优势:数据结构要求不严格 劣势:查询效率相对较低
redis的下载和安装
官网: https://redis.io
中文网站: https://www.redis.net.cn
下载后解压即可
解压以后有三个文件需要特别关注一下:
redis.windows.conf 配置文件
redis-server.exe 服务器文件
redis-cli.exe 客户端文件
启动redis服务器: redis-server.exe redis.windows.conf
启动客户端: redis-cli.exe [-h ip] [-p port] [-a password] redis-cli.exe -h 127.0.0.1 -p 6379 -a 123456
配置文件介绍 redis.windows.conf
bind 172.16.12.200 绑定ip 客户端连接的时候使用的ip
port 6379 redis服务器绑定的端口
requirepass 123456 服务器的密码
timeout 0 超时时间 单位是s 当客户端连接超过指定的时间没有发送数据就自动断开 0表示不自动断开
# Specify the server verbosity level.
# This can be one of:
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
loglevel notice 日志输出等级
logfile "" 日志输出到哪里去 可以指定一个文件 可以是stdout 表示输出到控制台
databases 16 设置有多少个数据库 默认选中第0个 可以使用select <dbid> 改变选中的数据库
保存数据到硬盘
# save <seconds> <changes>
save 900 1
save 300 10
save 60 10000
在保存数据的时候是否需要压缩这个数据 默认采用LZF压缩算法 如果需要节省保存时间可以考虑关闭这个功能 但是会导致保存后的数据很大
rdbcompression yes
保存数据的文件名
dbfilename dump.rdb
保存的目录
dir ./ 这个表示当前目录
redis的集群配置
主从配置
一主多从 主服务器可以修改数据 从属服务器只能查询数据
slaveof <masterip> <masterport> 配置当前服务器为从属服务器 注意:主服务器需要绑定ip 这里输入主服务器的ip和端口
masterauth <master-password> 连接主服务器需要的密码
slave-read-only yes 从属服务器只能查询数据
同一时间的最大连接数
maxclients 10000
最大内存限制 单位是字节 redis在的启动的时候会将硬盘中的数据加载到内存中,如果已经达到最大限制,则redis会尝试清除已经到期或者即将到期的数据,如果还是达到最大限制,则无法进行写入操作,但是还是可以进行读取操作
maxmemory <bytes>
添加数据的时候是否需要记录日志
appendonly no
写的日志保存的文件
appendfilename "appendonly.aof"
更新数据的条件
# appendfsync always 每次更新数据都会写入硬盘 (慢)
appendfsync everysec 每一秒写一次数据到硬盘
# appendfsync no 等redis自动将数据写入硬盘
数据类型
面试题:redis有几种数据类型?分别是什么?
有5种,分别是: string 字符串 set 集合 list 列表 hash 哈希 zset 有序集合
在redis中所有数据都是以k-v方式进行存储的
string字符串
set key value [EX seconds] [PX millseconds] 将字符串存入redis key 是数据的键 value 是数据的值 EX是设置过期时间单位是秒 PX是设置过期时间单位是毫秒
set aa bb EX 10
get key 获取指定key的值
get aa
getrange key start end 获取指定key的值的指定范围的字符串
getrange aaa 1 3
getset key value 修改指定的值返回旧的值
getset aaa 654321
setex key seconds value 和 set key value [EX seconds] 效果是一样的 可以设置过期时间
psetex key millseconds value 和 set key value [PX millseconds] 效果是一样的
del key [key...] 删除指定的key
set集合
不允许存在重复的值
sadd key member [member...] 往集合中添加一个或多个值
sadd myset a b c d
smembers key 获取集合中的所有元素
smembers myset
srem key member [member...] 删除指定key中的一个或多个值
srem myset a d
scard key 获取集合中元素的个数
scard myset
list 列表
可以往头尾去添加数据
添加
lpush key value [value...] 往列表的左边添加数据
rpush key value [value...] 往列表的右边添加数据
获取
lrange key start end 获取列表中指定范围内的数据
lrange mylist 0 -1 获取全部数据
lindex key index 获取列表中指定位置的数据
lindex mylist 1
llen key 获取列表的长度
llen mylist
删除
lpop key 删除并返回第一个元素
rpop key 删除并返回最后一个元素
修改
lset key index value 修改指定列表的指定位置上的数据
zset有序集合
有序集合sorted set 不允许存在重复的值
在添加数据的时候会给每一个元素添加一个double类型的分数(score) ,通过这个分数进行排序,元素不能重复,分数可以重复
添加
zadd key score value [score value...] 添加一个或多个元素 需要指定分数
zadd myzset 1 a 2 b 3 c 4 d
获取
zrange key start end [withscores] 获取指定范围内的数据 withscores 表示查询的结果是否带上分数
zrange myzset 0 2
zcard key 获取集合中的元素个数
zrank key member 获取集合中指定元素的位置 zrank myzset a
zscore key member 获取指定元素的分数
删除
zrem key member 删除集合中的指定元素
hash 哈希
hash是一个string类型的k-v映射表 比较适合存放对象的
添加和修改
hset key field value 将hash中的field的值设置成value
hmset key field value [field value...] 同时设置多个值进去
获取
hget key field 获取hash中指定field的值
hgetall key 获取hash中所有的字段和值
hexists key field 判断hash中是否存在field
hlen key 获取hash中的个数
hkeys key 获取hash中所有的key
hmget key field [field...] 获取指定的字段的值
删除
hdel key field [field...] 删除hash指定的field
通用命令
keys * 查看所有的键
type key 查看指定key的数据类型
del key 删除指定的key
config get name 获取配置文件中的配置信息
jedis
对于我们来说主要还是需要使用java来操作redis,jedis是一款java操作redis的客户端工具
添加依赖
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
jedis操作
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.UUID;
public class JedisTest {
@Test
public void string(){
//创建客户端对象去连接redis
Jedis jedis = new Jedis("127.0.0.1",6379);
jedis.auth("123456");//认证
jedis.select(0);//设置选中的数据库 默认是0
String a = jedis.get("a");
System.out.println(a);
String uuid = jedis.set("uuid", UUID.randomUUID().toString());
System.out.println(uuid);
jedis.close();
}
@Test
public void list(){
//创建客户端对象去连接redis
Jedis jedis = new Jedis("127.0.0.1",6379);
jedis.auth("123456");//认证
List<String> mylist = jedis.lrange("mylist", 0, -1);
System.out.println(mylist);
jedis.close();
}
@Test
public void zset(){
//创建客户端对象去连接redis
Jedis jedis = new Jedis("127.0.0.1",6379);
jedis.auth("123456");//认证
Set<String> myzset = jedis.zrange("myzset", 0, -1);
System.out.println(myzset);
jedis.close();
}
@Test
public void pool(){
//连接池的配置对象
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(10);
//连接池的对象
JedisPool jedisPool = new JedisPool(config,"127.0.0.1",6379,2000,"123456");
//从连接池中获取连接
Jedis resource = jedisPool.getResource();
//执行对应的操作
String a = resource.get("a");
System.out.println(a);
//操作完成后归还连接
resource.close();
}
}