Redis


NoSQL

1.什么是NoSQL

NoSQL = Not Only SQL(不仅仅是SQL),也可以解释为non-relative(非关系型数据库)。在NoSQL数据中数据之间是无联系的,无关系的。数据的结构是松散的,可变的。

2.为什么使用NoSQL

关系型数据库的瓶颈:

(1)无法应对每秒上万次的读写请求,无法处理大量的高并发操作。关系型数据库是IO密集型数据库。硬盘IO也变为性能瓶颈

(2)无法简单的通过增加硬件、服务节点来提高系统性能,数据整个存储在一个数据库中的,多个服务器没有很好的解决问题,来复制这些数据。

(3)关系型数据库大多数是收费的,对硬件的要求较高。软件和硬件的成本花费比重较大。

3.NoSQL的优势

(1)大数据量,高性能

​ NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于他的无关系性,数据库的结构简单。关系型数据库(例如MySQL)使用查询缓存。这种查询缓存更新数据后,缓存就失效了。在频繁的数据读写与交互应用中。缓存的性能不高。NoSQL的缓存性能要高的多

(2)灵活的数据模型

​ NoSQL无序为事先存储的数据建立字段,随时可以自定义数据格式。而在关系型数据库里,增删字段是一个非常麻烦的事情。如果是大数据量的表,增加字段简直就是一个噩梦。尤其在快速变化的市场环境中。用户的需要总是在不断变化的。

(3)高可用

​ NoSQL在不太影响性能的情况,就可以方便的实现高可用的框架。

​ NoSQL 能很好的解决关系型数据库扩展性差的问题。弥补了关系数据(比如MySQL)在某些方面的不足,在某些方面能极大的节省开发成本和维护成本

​ MySQL 和 NoSQL 都有各自的特点和使用的应用场景,两者结合使用,让关系型数据库关注在关系上,NoSQL关注在存储上

(4)低成本

​ 这是大多数分布式数据库共有的特点,因为主要是开源软件,没有昂贵的License成本

4.NoSQL的劣势

(1)不支持标准的SQL,没有公认的NoSQL标准

(2)没有关系型数据的约束,大多数也没有索引的概念

(3)没有事务,不能依靠义务实现ACID

(4)没有丰富的数据类型(数值,日期,字符串,二进制,大文本等)

Redis安装与使用

Redis是当今最流行的的基于KV结构的作为Cache使用的NoSQL数据库

1.Redis介绍

​ Remote Dictionary Server (Redis)是一个开源的使用C语言编写的,支持网络的,可基于内存亦可持久化的Key-Value数据库,Key字符类型,其值(value)可以是字符串(String),哈希值(Map),列表(list),集合(sets)和有序集合(sorted sets)等类型,每种数据类型都有自己的专属命令。所以她通常也别称为数据结构服务器。

​ Redis的作者是Antirez,来自意大利的西西里岛,现在居住在卡塔尼亚,目前供职于Pivotal公司(Prvotal是Sping框架的开发者),Antirez被称为Redis之父

2.Redis的作用

​ Redis是一个key-value结构的数据库库,把redis看作是一个大Map

(1)Redis是一个数据库,存储数据,可以对数据执行crud

(2)Redis可以作为Cache(缓存使用),提高数据的查询性能

3.Redis的安装

Linux先安装redis:https://www.cnblogs.com/hunanzp/p/12304622.html

4.基本配置

(1)启动Redis

  • 前台启动

    .redis-server redis.conf文件的路径

  • 后台启动

    相对路径: ./redis-server …/redis.conf

    启动客户端:redis-cli

(2)关闭Redis

  • 使用Redis客户端关闭

    ./redis-cli shutdown

  • linux命令关闭

    kill pid 或者 kill -9 pid

    可以用ps -ef | grep redis

5.Redis客户端

​ Redis客户端是一个程序,通过网络连接到Redis服务器,在客户端中使用Redis可以识别的命令。向redis服务器发送命令,告诉redis 想要做什么,redis把处理结果显示在客户端界面上,通过Redis客户端和Redis服务器交互

​ Redis客户端发送命令,同时显示Redis服务器的处理结果。

  • Redis自带的客户端

    redis-cli:redis自带的客户端,使用灵活,支持很多命令

    使用方式 ./redis-cli ,默认是连接到127.0.0.1 上面的 6379 的redis

    访问其他的服务器上的Redis: ./redis-cli -h ip -p port

  • Redis编程客户端

    jedis是redis的java编程客户端,redis官方首选推荐使用jedis,jedis是一个小但健全的redis的java的客户端,通过jedis可以像Redis命令行一样使用Redis

Redis基本命令

redis默认为16个库(在redis.conf文件可配置,该文件很重要,后续跟多操作都是基于这个配置文件的),redis 默认自动使用 0 号库

1.沟通命令,查看状态

ping

返回PONG,表示Redis服务运行正常

2.查看当前数据库中key的数目:dbsize

dbsize

返回当前数据库的的key的数量

3.redis默认使用16个库

Redis默认使用 16 个库,从 0 到 15 ,对数据库个数的修改,在redis.conf 文件中database 16

4.切换命令

使用其他数据库,select db

5.删除当前数据库:flushdb

6.退出命令:exit

7.Redis的Key的操作命令

keys pattern

作用:查找符合模式的pattern的key,pattern可以使用通配符。

通配符:

​ * : 表示 0 - 多个元素,keys * 表示查询所有的元素

​ ?: 表示单个字符,例如:wo?d,匹配word,wood

exists key [key …]

作用:判断key是否存在

存在返回1,其他返回0,存在多个key 返回多个key的数量

expire key seconds

设置key的存活时间

ttl key

查看key的存活时间

type key

查看key的所属类型

类型: none string list set zset hash

del key

用于删除一个key

string命令

set key value

get key

decr

incr

append key1 key2

strlen key

getrange key start end

setrange key offset replace

mset 创建多个key

hash命令

hset key value

hget key

hmset key value

hgetall key …

hdel key

hvals 获取所有的value

hexists

列表list

lpush key v1 v2…

rpush key v1 v2…

lrange key start end

lindex key

llen key

lrem key count value

lset key index value

linsert key before | after pivot value

集合类型set

sadd key member …

smembers key

sismember key member

scard key

srem key member …

srandmember key [count]

spop key [count]

sinsert key1 key2

sunion key1 key2

sdiff key1 key2

有序集合zset

zadd key score member [score member…]

zrange key start stop [withscores]

zreverange key start stop [withscores]

zrem key v1 v2

scard key

zrangebyscore key min max [withscores] [limit offset count]

​ 可以加一个小括号 表示不包含

​ -inf 表示最小值,+inf 表示最大值

zrevrangebyscore key max min [withscores] [limit offset count]

zcount key min max. 统计分数的个数

Redis事务

一.什么是事务

​ 事务 是指一系列操作步骤,这一系列操纵步骤,要么完全执行,要么完全不执行。

​ Redis中的事务(transaction)是一组命令的集合,至少是两个或两个以上的命令,redis事务保证这些命令被执行时中间不会被任何其他操作打断。

1.multi

语法:multi

作用:标记一个事务的开始。

返回值: 总是返回ok

2.exec

语法:exec

作用:执行所有事务块内的命令

返回值:若事务被打断,返回null

3.discard

语法:discard

作用:取消事务,放弃执行事务块的所有命令

返回值:总是返回ok

事务执行时的几种情况:

(1)正常执行事务

​ 事务的执行步骤,首先开启事务,其次向事务队列中加入命令,最后执行事务提交

​ multi

​ ,…

​ exec

(2)事务执行exec之前,入队命令错误(语法错误:严重错误导致服务器不能正常工作,如内存不足),放弃事务

(3)事务执行exec命令后,命令执行错误,事务提交

​ 结论:在exec执行后的所产生的事务的错误,即使 事务中有某个/某些命令在执行时产生了错误,事务中的其他命令仍会继续执行

​ redis 在事务失败时不进行回滚,而是继续执行余下命令

(4)主动放弃事务

执行步骤:

​ multi

​ …

​ discard

(5)Redis的watch机制

  • redis中的watch机制

WATCH原理:

​ 使用WATCH监视一个或多个key,跟踪key的value修改情况,如果有key的value值在事务exec执行之前被修改了,整个事务被取消,Exec返回提示信息,表示事务已经失败

  • watch的使用

    语法:watch key [key…]

    作用:监视一个或多个key,如果在事务执行之前这个key被其他命令所改动那么事务将被打断

    返回值:总是返回ok

  • unwatch

    语法:unwatch

    作用:取消watch命令对所有key的监视,如果在执行watch命令之后,exec命令或discard命令先被执行了的话,那么就不需要在执行unwatch了

    返回值:总是返回ok

    持久化

    一.持久化

    ​ 持久化可以理解为存储,即使将数据存储到一个不会丢失的地方,如果数据存放在内存中,电脑关闭或重启数据就会丢失,所以放在内存中的数据时不会持久化的,而放在磁盘就像相当于一种持久化

    ​ Redis的数据存储在内存中,内存时瞬时的,如果linux宕机或重启,又或者linux崩溃或重启,所有内存数据都会丢失,为解决这个问题,Redis提供两种机制对数据进行持久化存储,便于发生故障后能迅速恢复数据

    二.持久化方式

    (1)RDB方式

    什么是RDB方式?

    ​ Redis Database(RDB),就是在指定的时间间隔内将内存中的数据集快照写入磁盘,数据恢复时将快照文件直接在读到内存

    ​ RDB保存了在某个时间点的数据集(全部数据)。存储在一个二进制文件中,只有一个文件。默认是dump.rdb。RDB技术非常适合做备份,可以保存最近一个小时,一天,一个月的全部数据。保存数据只是在单独的进程中写文件,不影响Redis的正常使用。RDB恢复数据时比其他AOF速度快

    如何实现?

    RDB 方式的数据持久化,仅需要在redis.conf 文件中配置即可,默认是配置启用的。

    在配置文件中redis.conf中搜索 SNAPSHOTTING ,查找在注释开始和结束之间的关于RDB的配置说明。配置SNASHOTTING 有三个地方:

    <1.配置执行RDB生成快照文件的时间策略

    ​ 对Redis进行设置,让它在 N 秒内数据集至少有M个key改动这一条满足自动保存一次数据集

    ​ 配置格式: save <seconds> <changes>

    ​ save 900 1

    <2.dbfilename:设置RDB的文件名,默认文件名为dump.rdb

    ❤️.dir:指定RDB文件的存储位置,默认是 / 当前目录下

    配置步骤:

    <1, 停用 redis 服务 redis-cli shutdown,(ps -ef | grep redis 查看)

    <2. 修改redis.conf 文件,修改前先备份 cp redis.conf bak_redis.conf

    ❤️.查看默认启用的 RDB,cd 到 redis/src 目录下,执行 ll dump.rdb

    (2)AOF方式

    什么是AOP方式

    ​ Append-only File(AOF),Redis 每次接收到一条改变数据的命令时,他将该命令写到一个AOF文件中(只记写操作,读操作不记录),当Redis重启时,他通过执行AOF文件中,所有的命令来恢复数据

    如何实现

    ​ AOF方式的数据持久化,仅需要在redis.conf 文件中配置即可

    配置项:

    appendOnly:默认是no,改成yes,即开启了aof持久化

    appendfilename:指定aof文件,默认文件名appendonly.aof

    dir:指定RDB和AOF文件存放的目录,默认是 ./

    appendfsnyc: 配置项aof文件写命令数据的策略

    no:不主动进行同步策略,而是完全交由操作系统来同步(即每 30 秒一次),比较快 但不是很安全

    always:每次执行写入都会执行同步,慢一些但比较安全。

    eveysec:每秒的同步操作,比较平衡,介于速度和安全之间。这是默认项

    auto-aof-rewrite-min-size:允许重写最小AOF文件大小,默认是64M。当AOF文件大小大雨64 M时,开始整理AOF文件,去掉无用的操作步骤,缩小AOF文件

    操作步骤:

    ​ <1.停止redis服务,备份redis.conf

    ​ <2.查看redis安装目录/src下 有无.aof 文件。默认是在redis的当前目录

    ​ ❤️.编辑redis.conf

    设置 appendonly 为yes 即可

    查看appendfsync 的当前策略

    查看 appendfilname的文件名称

    总结:

    可以设置rdb 与 aof 同事开启 ,会优先使用aof ,但是没有必要,

    如果只是 做数据的缓存,使用rdb 就足够了,

    如果是做数据的存储,可以使用aof 存储

    Redis高可用特性

    ​ 主从复制:一个主的Redis服务器用来操作 写操作,其他Redis服务器用来操作 读操作,通过配置将主从服务器的数据保持一致

    ​ 哨兵:用来监视主服务器功能是否完好,会自动化的处理主从服务器之间的关系

    这里先简单了解,在生产环境用到时 现需先用

    Redis安全设置

    一.设置密码

    ​ 访问Redis默认时没有密码的,这样不安全,任何用户都可以访问,可以启用密码才能访问redis。设置Redis的访问密码,修改redis.conf中这行requirepass 密码。密码 要比较复杂,不容易破解,而且需要定期修改。因为redis速度相当快,所以在一台比较好的服务器下,一个外部用户可以在一秒钟进 150k 次的密码尝试。需要指定非常非常强大的密码来防止暴力破解

    1.开启访问密码设置

    ​ 修改redis.conf,使用vim命令,找到requirepass行 去掉注释,requirepass空格后就是密码

    2**.访问有密码的redis**

    ​ <1. 先 redis-cli ,使用auth 命令,输入密码

    ​ <2.redis-cli -h ip -p port -a password

    二.修改端口

    ​ 在redis.conf 文件中 修改 prot 6379 这一行

Jedis操作

使用Redis官方推荐的的Jedis,在java应用中操作Redis。Jedis几乎涵盖了Redis所有命令。操作Redis的命令在Jedis中以方法形式出现。jedis完全兼容redis2.8.x and 3.x.x

首先需要导包:Jedis 和 Commons-Pool

一.简单使用Jedis
public static void main(String[] args) {

    String host = "127.0.0.1";
    Integer port = 6379;
    Jedis jedis = new Jedis(host,port);
    String s = jedis.get("zhangsan");
    System.out.println(s);
    jedis.mset("zhangsan","333","lisi","444");

}
二.使用线程池

JedisUtil

public class JedisUtil {
    // jedisPool 唯一
    private static JedisPool jedisPool;
    // 创建线程池
    public static JedisPool getJedisPool(String host,Integer prot){
        if(jedisPool == null){
            // 创建线程池
            JedisPoolConfig config = new JedisPoolConfig();
            // 设置最大线程数量
            config.setMaxTotal(100);
            // 设置空闲数
            config.setMaxIdle(2);
            // 设置检查项为true,避免null的情况
            config.setTestOnBorrow(true);
            // 创建线程池
            jedisPool = new JedisPool(config,host,prot);
        }
        return jedisPool;
    }
    // 关闭线程池
    public static void closeJedisClose(){
        if(jedisPool != null){

            jedisPool.close();
        }
    }
}

test

public class MyJedis {
    public static void main(String[] args) {

        String host = "127.0.0.1";
        Integer port = 6379;
        JedisPool jedisPool = JedisUtil.getJedisPool(host, port);
        // 从线程池中获取一个jedis
        Jedis jedis = jedisPool.getResource();

        String s = jedis.get("zhangsan");
        System.out.println(s);
        jedis.mset("zhangsan","333","lisi","444");

    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值