redis

目录

1 什么是NOSQL

2 redis

2.1 redis的优点

2.2 如何安装redis

2.3 了解一下redis.conf

3 安装redis客户端界面

4 redis常用命令

4.1 对key操作的命令

3.2 对redis数据库的操作

5 redis支持的数据类型

5.1 Strings类型

5.2 Hash哈希类型

5.3 list列表类型

5.4 set集合类型

5.5 sort set有序集合

6 redis的使用场景

7 redis的持久化

7.1 RDB快照持久化方式

7.1.1 RDB的触发方式

7.2 AOF日志追加持久化方式

8 redis集群模式

8.1 主从复制模式

8.2 哨兵模式

8.3 集群化模式

9 java连接redis

9.1 使用jedis

9.2 使用连接池连接redis

9.3 java连接redis集群模式


1 什么是NOSQL

nosql(not only sql)不仅仅是sql。NoSQL,泛指非关系型的数据库。非关系型的数据库则由于其本身的特点得到了非常迅速的发展。

非关系数据库和关系型数据库之间的区别:

RDBMS---关系型数据
- 高度组织化结构化数据。
- 结构化查询语言(SQL) select
- 数据和关系都存储在单独的表中。
- 数据操纵语言DML,数据定义语言DDL
- 严格的一致性. 事务 ACID
- 基于事务
NoSQL--非关系型数据库---缓存数据
- 代表着不仅仅是SQL
- 没有声明性查询语言  
- 键 - 值对存储 key value
- 非结构化和不可预知的数据  
- 高性能,高可用性和可伸缩性。 适合搭建集群。

NOSQL的产品  

Mongodb:

redis:

Hbase:针对大数据

2 redis

Redis是一种开放源代码(BSD许可)的内存中数据结构存储,用作数据库,缓存和消息代理。Redis提供数据结构,例如字符串,哈希,列表,集合,带范围查询的排序集合,位图,超日志,地理空间索引和流。Redis具有内置的复制,Lua脚本,LRU驱逐,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供了高可用性。

2.1 redis的优点

1.Redis读取的速度是110000次/s,写的速度是81000次/s

2.原子 。Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。

3.支持多种数据结构:string(字符串);list(列表);hash(哈希),set(集合);zset(有序集合)

4.持久化--磁盘,主从复制(集群)

5.官方不支持window系统,但是又第三方版本。 linux系统。

2.2 如何安装redis

安装redis的依赖。
yum install -y gc-c++

解压redis安装包

tar -zxvf 安装包

进入redis解压目录
make 编译c语言
make install 安装redis

启动redis
redis-server  redis配置文件名

连接redis
redis-cli   默认连接为127.0.0.1 端口号6379

redis-cli -h ip  -p port  远程连接其他人的redis

2.3 了解一下redis.conf

(1)设置redis后台启动

 (2)修改端口号

 (3)设置远程连接

 

3 安装redis客户端界面

4 redis常用命令

redis命令手册

Redis 命令参考 — Redis 命令参考

4.1 对key操作的命令

1. 查看所有的key  [keys *]
2. 为指定的key设置过期时间。 [expire key  seconds]
3. 查看key的剩余存活时间 ttl key   返回-1表示永远存在 -2不存在该key  
4. 删除指定的key  delete key...  返回结果为删除的个数
5. 判断指定的key是否存在  exists key

3.2 对redis数据库的操作

默认redis中由16库。可以通过修改redis配置文件更改数量。

select n: 切换redis库。n[0~databases-1]
flushdb: 清空当前所在的库。
flushall: 清空所有库的内容。----

5 redis支持的数据类型

我们使用频率最高是: Strings字符串类型,Lists列表类型,Sets集合类型,Hashes哈希类型,Sorted Sets 有序集合。这里所谓的类型,就是value的类型。

5.1 Strings类型

它的value值为String类型,在实际开发中,它可以存储任意的数据类型。因为任何对象可以转换为json字符串。它的默认存放的大小512M.

关于string类型的命令由哪些?

set key value: 存储指定key和value的值。
get key: 获取指定key的value值。
mset key value key value...:存储多个key和value的值
mget key key ...:获取多个key对应的value。
setnx key value: 如果指定的key存在,则不存入。如果不存在,则存入。
setex key second value: 存储指定的key和value并设置过期时间。
incr key: 对指定key的value递增。----点赞 收藏数 主键的递增
decr key: 对指定key的value递减

5.2 Hash哈希类型

它的value值为hash类型,hash类型由field和value组成。适合存储对象。

关于hash类型的命令由哪些?

hset key field value: 存储指定key的field和value值。
hget key field: 获取指定key的field对应的value值。
hgetall key: 获取在哈希表中指定 key 的所有字段和值
hkeys key: 获取指定key所有field名称
hvals key: 获取指定key的所有value值。
hdel key field: 删除指定key对应的field值

5.3 list列表类型

它的value类型为list列表类型,它的value可以是多个值,而且这些者可以重复,有序。一般使用在消息队列。

常用的方法

 1.lpush key value value....:从左边存储指定key的对应列表值。
2.lpop key: 移出并获取列表的第一个元素
3.lrange key start end: 获取列表指定范围内的元素
4.lindex key index: 根据下标获取指定的元素
5.lset key index value: 修改指定坐标的元素内容

5.4 set集合类型

它的value类型是一个set集合类型,这个集合类型元素无需,且不能重复。求两个集合的交集

常见的命令

1.sadd key value....:向集合添加一个或多个成员
2.smembers key :返回集合中的所有成员
3.spop key: 随机获取某个元素并移除
4.sinter k1 k2.。。:    返回给定所有集合的交集

5.5 sort set有序集合

它的value类型为一个带分数的集合类型。按照分数排序。应用在: 排行榜

 zadd key score value score value.....: 往redis中添加有序集合
zrange key start end: 获取指定返回的元素
ZREVRANGE k1 0 -1 WITHSCORES: 分数从高到低

6 redis的使用场景

1、热点数据的缓存: 减少对数据库的访问频率和减轻数据库的压力。
2. 限时业务的运用: 秒杀  存储登录者用户信息  存储短信验证码
3. 计数器相关问题: 点赞数 收藏数 播放量
4. 排行榜相关问题: sort set
5. 分布式锁:

7 redis的持久化

持久化:把内存中的数据库保存到磁盘上,防止数据的丢失。

redis支持的持久化方式两种:
  (1)RDB:快照  其实就是把数据以快照的形式保存在磁盘上,什么是快照呢,你可以理解成把当前时刻的数据拍成一张照片保存下来。
 (2)AOF :日志追加 记录服务器接受的每个写入操作,当服务器启动时再次加载该日志,会把日志中的命令重新执行一遍。

7.1 RDB快照持久化方式

7.1.1 RDB的触发方式

 1.手动触发
   【1】save堵塞型保存
    [2]bgsave非堵塞型保存
2.自动触发

默认保存的文件名: dump.rdb 可以在redis.conf名称  

save

该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。具体流程如下:

执行完成时候如果存在老的RDB文件,就把新的替代掉旧的。我们的客户端可能都是几万或者是几十万,这种方式显然不可取。

bgsave:

执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体流程如下:

自动触发rdb

修改redis的配置文件。

7.2 AOF日志追加持久化方式

默认该文件的名称:

 默认aof不会开启

 查看

 

 aof模式会把每个写操作,记录到一个日志文件,当redis启动时会把该日志中每个指令重新执行一遍。 数据恢复速度慢。数据完整性高

如果两则都使用,恢复数据时按照aof恢复。因为redis认为它的完整性比较好。大多数使用rdb.

8 redis集群模式

redis单机版,出现单机故障后,导致redis无法使用,如果程序使用redis,间接导致程序出错。

redis的集群模式:

  1. 主从复制模式

  2. 哨兵模式

  3. 集群化模式

8.1 主从复制模式

一主多从模式。一个主节点,多个从节点,那么主节点可以负责:读操作,写操作。 从节点只能负责读操作,不能负责写操作。 这样就可以把读的压力从主节点分摊到从节点,以减少主节点的压力。

当主节点执行完写命令,会把数据同步到从节点。

(1)如何搭建主从关系

原则:配从不配主。

准备: 一主二从-----3台----开三个虚拟机--为了节省虚拟机,在一台主机开启三个redis服务。

7001主节点 7002和7003作为从节点

修改端口号以及rdb文件的名称.

 启动redis服务

 进入三个redis服务的客户端

查看三个redis服务的主从关系

 配置7002和7003为7001的从节点

通过实验: 我们在主节点上执行set k1 v1 可以发现从节点也存在该数据.证明同步到从节点。

可以看出主节点可以读和写。但是从节点只能读。

思考: 1.  如果主节点挂了,从节点会不会上位? 不会
     2.  如果增加一个新的从节点,新从节点会不会把之前的数据同步过来。会

8.2 哨兵模式

 由于主从模式,主节点单机后,从节点不会自动上位。 增加一个哨兵服务,该哨兵时刻监控master,如果master挂了,哨兵会在从节点中选举一位为主节点【哨兵投票机制】。

 修改配置

 启动哨兵

redis-sentinel sentinel.conf

测试:

主节点挂掉:

shutdown---redis-cli客户端

8.3 集群化模式

不管上面的主从还是哨兵模式,都无法解决单节点写操作的问题。如果这时写操作的并发比较高。这是可以实验集群化模式【去中心化模式】

 原理:

redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个整数结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。

当你往Redis Cluster中加入一个Key时,会根据crc16(key) mod 16384计算这个key应该分布到哪个hash slot中,一个hash slot中会有很多key和value。你可以理解成表的分区,使用单节点时的redis时只有一个表,所有的key都放在这个表里;改用Redis Cluster以后会自动为你生成16384个分区表,你insert数据时会根据上面的简单算法来决定你的key应该存在哪个分区,每个分区里有很多key。

 搭建:

三主三从:
   6001 6002 6003 主节点
   6004 6005 6006 从节点

Redis-1 防火墙--6379

bind 0.0.0.0 87行

port 6001 138行

daemonize yes 309行

dbfilename dump6001.rdb 481行

# 打开aof 持久化

appendonly yes 1379行

appendonly appendonly6001.aof 1406行

# 开启集群

cluster-enabled yes 1576行

# 集群的配置文件,该文件自动生成

cluster-config-file nodes-6001.conf 1584行

# 集群的超时时间

cluster-node-timeout 15000 1590行

 启动这六个redis服务

 分配槽--分主从5.0前很复杂

redis-cli --cluster create --cluster-replicas 1 192.168.175.137:6001 192.168.175.137:6002 192.168.175.137:6003 192.168.175.137:6004 192.168.175.137:6005 192.168.175.137:6006

注意: 一定要保证每个节点都没有数据。

测试:

redis-cli -c -h 192.168.175.137 -p 6001

 可以把写操作均摊到不同的节点上,减轻了单个主节点的压力

9 java连接redis

redis支持哪些语言可以操作

 

9.1 使用jedis

(1)添加jedis依赖

<!--jedis依赖-->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

(2)代码测试

 @Test
    public void Test01(){
        //连接redis--->必须保证你的redis服务运行远程连接。
        //该对象中把每个redis命令封装成对应的方法了。
        Jedis jedis = new Jedis("192.168.175.137",6379);
        //字符串操作
        String s = jedis.set("k1", "v1");
        System.out.println(s);
        String setex = jedis.setex("k2", 20, "v2");
        System.out.println(setex);
        Long setnx = jedis.setnx("k3", "v3");
        System.out.println(setnx);

        //hash操作
        jedis.hset("k4","name","笑笑");
        jedis.hset("k4","age","12");

        Map<String,String> map = new HashMap<>();
        map.put("name","小杨");
        map.put("age","22");
        jedis.hset("k6",map);
        jedis.close();
        //耗时
        long starts = System.currentTimeMillis();
        for(int i=1;i<1000;i++){
            String ping = jedis.ping();
            jedis.close();
        }
        long end = System.currentTimeMillis();
        System.out.println("总耗时:"+(end-starts));
    }

9.2 使用连接池连接redis

@Test
    public void Test02(){
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(20);
        jedisPoolConfig.setMinIdle(5);
        jedisPoolConfig.setMaxWaitMillis(3000);
        JedisPool jedisPool= new JedisPool(jedisPoolConfig,"192.168.175.137",6379);
        long starts = System.currentTimeMillis();
        for(int i=1;i<1000;i++){
            //从jedis连接池获取资源
            Jedis jedis = jedisPool.getResource();
            String ping = jedis.ping();
            jedis.close();
        }
        long end = System.currentTimeMillis();
        System.out.println("总耗时:"+(end-starts));
    }

9.3 java连接redis集群模式

@Test
    public void Test03(){
        Set<HostAndPort>  nodes = new HashSet<>();
        nodes.add(new HostAndPort("192.168.175.137",6001));
        nodes.add(new HostAndPort("192.168.175.137",6002));
        nodes.add(new HostAndPort("192.168.175.137",6003));
        nodes.add(new HostAndPort("192.168.175.137",6004));
        nodes.add(new HostAndPort("192.168.175.137",6005));
        nodes.add(new HostAndPort("192.168.175.137",6006));
        JedisCluster jedisCluster = new JedisCluster(nodes);
        jedisCluster.set("k1","你好");
        jedisCluster.close();
    }
Redis 用法 简单说明ppt 初学者试用。 string: =============================================================================== SET name "John Doe" GET name 批量的读写操作 MSET age 30 sex "male" MGET age sex 存储数字 INCR age INCRBY age 4 GET age DECR age DECRBY age 4 GET age 修改和获取操作 APPEND name " Mr." GET name STRLEN name SUBSTR name 0 3 bit操作 SETBIT bit 10086 1 SETBIT bit 200 1 SETBIT bit 300 1 GETBIT bit 10086 GETBIT bit 100 BITCOUNT bit 设置超时 SETEX key_with_time 10 "same values" ttl key_with_time ttl key_with_time get key_with_time 如果服务器返回 OK ,那么这个客户端获得锁。 如果服务器返回 NIL ,那么客户端获取锁失败,可以在稍后再重试。 第一次成功,第二次失败(nil) set unknown "some data" NX EX 100 set unknown "some data" NX EX 100 key ===================================================================================== keys * SET name huangz EXISTS name DEL name 数据过期设置 SET name "John Doe" TTL name 先用EXISTS命令查看key值是否存在,然后设置了5秒的过期时间 EXISTS name EXPIRE name 5 EXISTS name GET name List ===================================================================================== 基本list操作 LPUSH students "John Doe" LPUSH students "Captain Kirk" LPUSH students "Sheldon Cooper" LLEN students LRANGE students 0 2 LPOP students LLEN students LRANGE students 0 1 LREM students 1 "John Doe" LLEN students LRANGE students 0 -1 多种修改操作 LINSERT students BEFORE "Captain Kirk" "Dexter Morgan" LRANGE students 0 -1 LPUSH students "Peter Parker" LRANGE students 0 -1 LTRIM students 1 3 LLEN students LRANGE students 0 2 LREM students 1 "John Doe" LLEN students LRANGE students 0 1 阻塞行为 确保key都被删除, 为command列表增加一个值,job 列表为空,被跳过,紧接着 command 列表的第一个元素被 DEL job command request LPUSH command "update system..." LPUSH request "visit page" BLPOP job command request 300 BLPOP job command request 300 BLPOP job command request 300 从别的窗口 LPUSH job "aaa" 等待10秒回怎样呢? BLPOP job command request 10 在MULTI/EXEC事务中的BLPOP # 对非空列表进行操作 RPUSH job "programming" MULTI BLPOP job 30 EXEC # 不阻塞,立即返回 # 对空列表进行操作 LLEN job MULTI BLPOP job 30 EXEC #不阻塞,立即返回(nil) SET ===================================================================================== 基本操作 SADD birds crow SADD birds pigeon SADD birds bat SADD mammals dog SADD mammals cat SADD mammals bat SMEMBERS birds SMEMBERS mammals 修改操作 SREM mammals cat SMEMBERS mammals SADD mammals human SMEMBERS mammals SISMEMBER mammals human 集合的子交并补等操作 SINTER birds mammals SUNION birds mammals SDIFF birds mammals Ordered SET ===================================================================================== ZADD days 0 mon ZADD days 1 tue ZADD days 2 wed ZADD days 3 thu ZADD days 4 fri ZADD days 5 sat ZADD days 6 sun ZCARD days ZRANGE days 0 6 ZSCORE days sat ZCOUNT days 3 6 ZRANGE days 0 -1 ZRANGE days 0 -1 WITHSCORES ZREVRANGE days 0 -1 ZREVRANGE days 0 -1 WITHSCORES ZRANGEBYSCORE days 0 6 ZRANGEBYSCORE days 0 6 WITHSCORES ZRANK days sat HASH ===================================================================================== HSET student name "Ganesh" HSET student age 30 HSET student sex "Male" HKEYS student HVALS student HGETALL student HGET student sex HDEL student sex HGETALL student 多值设置 HMSET kid name Akshi age 2 sex Female HMGET kid name age sex 数据库操作 ===================================================================================== DBSIZE # 0 号数据库的 key 数量 SELECT 1 # 切换到 1 号数据库 DBSIZE # 1 号数据库的 key 数量 flushall # 清空所有数据库的所有 key DBSIZE # 不但 1 号数据库被清空了 SELECT 0 # 0 号数据库(以及其他所有数据库)也一样 DBSIZE -在Redis中,你可以设定对某一个key值进行消息发布及消息订阅,当一个 key值上进行了消息发布后,所有订阅它的客户端都会收到相应的消息。 这一功能最明显的用法就是用作实时消息系统,比如普通的即时聊天,群聊等功能。 Publish/Subscribe ===================================================================================== 用一个客户端订阅管道 SUBSCRIBE channelone 另一个客户端往这个管道推送信息 PUBLISH channelone hello PUBLISH channelone world 用一个客户端订阅所有channel开头的信息通道 PSUBSCRIBE channel* 另一个客户端对两个推送信息 PUBLISH channelone hello PUBLISH channeltwo world 事务性 ===================================================================================== NX结尾命令都是判断在这个值没有时才进行某个命令。 SET name "John Doe" SETNX name "Dexter Morgan" GET name Redis还支持自定义的命令组合,通过MULTI和EXEC,将几个命令组合起来执行 SET counter 0 MULTI INCR counter INCR counter INCR counter EXEC GET counter DISCARD命令来中断执行中的命令序列 SET counter 0 MULTI INCR counter INCR counter INCR counter DISCARD GET counter 持久化 ===================================================================================== 数据快照的原理是将整个Redis中存的所有数据遍历一遍存到一个扩展名为rdb的数据文件中。通过SAVE命令可以调用这个过程。 SET name "John Doe" SAVE SET name "Sheldon Cooper" BGSAVE /home/dong1/redis-2.6.16/src/dump.rdb 其日志文件以aof结局,我们一般各为aof文件。要开启aof日志的记录 你需要在配置文件中进行如下设置: appendonly yes 管理命令 ===================================================================================== Redis支持多个DB,默认是16个,你可以设置将数据存在哪一个DB中,不同DB间的数据具有隔离性。也可以在多个DB间移动数据。 SELECT 0 SET name "John Doe" SELECT 1 GET name SELECT 0 MOVE name 1 SELECT 1 GET name DBSIZE INFO FLUSHDB SET name "John Doe" DBSIZE SELECT 1 DBSIZE SELECT 0 FLUSHDB DBSIZE FLUSHALL DBSIZE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值