redis&jedis-14

Redis是一款高性能的非关系型数据库,常用于缓存服务。它支持多种数据类型如string、set、list、hash和zset。文章介绍了Redis的下载安装、配置、数据持久化以及通过Java的Jedis库进行操作的方法。此外,还对比了Nosql和关系型数据库的优缺点。
摘要由CSDN通过智能技术生成

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();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员zhi路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值