【学习笔记】Redis

本文详细介绍了Redis,一个高性能的Key-Value数据库,包括NoSQL介绍、Redis的安装与启动、数据结构与常用指令、持久化存储方式、主从复制和哨兵模式、集群方案等内容。通过实例演示了Linux下Redis的安装、启动、客户端访问、数据结构操作以及Java连接Redis的方法。文章还探讨了Redis的事务管理、发布订阅模式以及应对缓存问题的策略,如雪崩、穿透、击穿等,是学习和使用Redis的全面参考资料。
摘要由CSDN通过智能技术生成

1.NoSql介绍

NoSQL,泛指非关系型的数据库。NoSQL最常见的解释是“non-relational”, “Not Only SQL”也被很多人接受。NoSQL仅仅是一个概念,泛指非关系型的数据库,区别于关系数据库,它们不保证关系数据的ACID特性。
在这里插入图片描述

2.Redis介绍

REmote DIctionary Server(远程字典服务器)。是完全开源免费的,用C语言编写的, 遵守BCD协议。是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。

优势:
(1) 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
(2) 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。(不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储)
(3) 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
(4) 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性
(5) 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
(6) 使用多路I/O复用模型,非阻塞IO;
(7) Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
(8) Redis支持数据的备份,即master-slave(主从)模式的数据备份

应用场景:
(1) 缓存(数据查询,短连接,新闻内容,商品内容等)
(2) 聊天室在线好友列表
(3) 任务队列(秒杀,抢购,12306等)
(4) 应用排行榜
(5) 网站访问统计
(6) 数据过期处理(可以精确到毫秒)
(7) 分布式集群架构中的session问题

下载:
(1)Http://redis.io/ 英文地址
(2)Http://www.redis.cn/ 中文地址

3.Linux下安装与启动Redis

安装

环境准备
(1)虚拟机版本:VMware® Workstation 12 Pro
(2) Linux系统:Centos Release 6.5
(3) 远程命令端:xshell
(4)文件传输工具:SecureFXPortable

1.安装Redis的编译环境
Redis是C语言开发的,安装redis需要先去官网下载源码进行编译,编译需要依赖于GCC编译环境,如果CentOS上没有安装gcc编译环境,需要提前安装,安装命令如下:(这里我们使用root用户 处理这些操作)

[root@czn001 ~]# yum install gcc-c++

如果提示是否下载,选择: y
如果提示是否安装,选择: y

2.使用SecureFXPortable上传Redis安装文件到Linux目录

3.解压redis文件
在这里插入图片描述
在这里插入图片描述
4.编译Redis(编译,将.c文件编译为.o文件)
进入解压文件夹,执行 make。

[a@czn001 redis-5.0.5]$ make

5.安装,要指定安装路径

[a@czn001 redis-5.0.5]$ make PREFIX=/home/a/redis/redisInstall install

6.查看redis安装文件夹里的bin文件夹
在这里插入图片描述
7.将解压文件夹里的配置文件复制到安装文件夹里
Redis启动需要一个配置文件,可以修改端口号信息。将redis解压的文件夹中的redis.conf文件复制到安装目录。
在这里插入图片描述

启动

前端启动(不推荐)
直接运行bin/redis-server将使永前端模式启动,前端模式启动的缺点是启动完成后,不能再进行其他操作,如果要操作必须使用ctrl+c,同时redis-server程序结束,不推荐此方法。
在这里插入图片描述
后端启动
1.修改redis.conf配置文件,设置:daemonize yes,然后可以使用后端模式启动。

[a@czn001 redisInstall]$ vi redis.conf

在这里插入图片描述
2.启动时,指定配置文件

[a@czn001 redisInstall]$ ./bin/redis-server ./redis.conf

3.判断是否启动成功。Redis默认端口:6379,通过当前服务进行查看。

[a@czn001 redisInstall]$ ps -ef | grep -i redis

在这里插入图片描述

客户端访问redis

如果想要通过指令来操作redis,可以使用redis的客户端进行操作,在bin文件夹下运行redis-cli
如果不指定ip和端口号,默认ip为127.0.0.1,默认端口号为6379。也可以指定ip和端口号。
ping:测试客户端与Redis的连接是否正常,如果连接正常,会收到pong。
quit:退出客户端。
在这里插入图片描述
在这里插入图片描述

关闭redis

在这里插入图片描述

[a@czn001 bin]$ ./redis-cli shutdown

可视化工具:Redis Desktop Manager

类似于Navicat连接MySQL数据库。

1.先要关闭Linux防火墙,然后去修改redis.conf文件中的bind参数,原来是bind 127.0.0.1,把ip地址改成该Linux的实际ip地址。

2.重新启动redis

[root@czn001 redisInstall]# ./bin/redis-server ./redis.conf

3.客户端访问redis,并进行ping-pong测试

[root@czn001 bin]# ./redis-cli -h ip地址 -p 6379
ip地址:6379> ping
PONG

4.Redis Desktop Manager连接Linux的Redis数据库。
Host这一栏填Linux的ip地址
在这里插入图片描述

4.Redis数据结构及其对应的常用指令

Redis是一种基于内存的数据库,并且提供一定的持久化功能,它是一种键值(key-value)数据库,使用 key 作为索引找到当前缓存的数据,并且返回给程序调用者。
当前的 Redis 支持 6 种数据类型,它们分别是字符串(String)、列表(List)、集合(set)、哈希结构(hash)、有序集合(zset)和基数(HyperLogLog)。(前5种重点掌握,最后一种了解即可。)
在这里插入图片描述
各数据类型对应不同的指令,
指令学习网站:http://doc.redisfans.com/index.html

String

赋值语法:SET key value
取值语法: GET key

127.0.0.1:6379> set k1 zhangsan
OK
127.0.0.1:6379> get k1
"zhangsan"

设置多个键语法: MSET key value [key value …]
获取多个键值语法: MGET key [key …]

127.0.0.1:6379> mset k2 lisi k3 wangwu
OK
127.0.0.1:6379> mget k2 k3
1) "lisi"
2) "wangwu"

删除语法:DEL key

127.0.0.1:6379> del k3
(integer) 1
127.0.0.1:6379> get k3
(nil)

字符串数字的递增与递减

递增数字:当存储的字符串是整数时,Redis提供了一个实用的命令INCR,其作用是让当前键值递增,并返回递增后的值。
递增数字语法: INCR key
递减数值语法: DECR key
增加指定的整数语法: INCRBY key increment
减少指定的整数 语法:DECRBY key decrement

递增

127.0.0.1:6379> incr num
(integer) 1
127.0.0.1:6379> incr num
(integer) 2

递减

127.0.0.1:6379> decr num
(integer) 1

指定步长:(了解)

127.0.0.1:6379> incrby num2 2
(integer) 2
127.0.0.1:6379> incrby num2 3
(integer) 5
127.0.0.1:6379> decrby num2 2
(integer) 3
127.0.0.1:6379> decrby num2 1
(integer) 2

Hash

hash叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。相当于是对象格式的存储。

赋值语法: HSET key field value
设置一个字段值, HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0。
取值语法: HGET key field

127.0.0.1:6379> hset user1 username zhangsan
(integer) 1
127.0.0.1:6379> hset user1 username lisi
(integer) 0
127.0.0.1:6379> hget user1 username
"lisi"

设置多个字段语法: HMSET key field value [field value …]
取多个值语法: HMGET key field [field …]

127.0.0.1:6379> hmset user1 password 123 age 20
OK
127.0.0.1:6379> hmget user1 password age
1) "123"
2) "20"

获取所有字段值语法:HGETALL key

127.0.0.1:6379> hgetall user1
1) "username"
2) "lisi"
3) "password"
4) "123"
5) "age"
6) "20"

删除字段语法:HDEL key field [field …]

127.0.0.1:6379> hdel user1 username
(integer) 1
127.0.0.1:6379> hgetall user1
1) "password"
2) "123"
3) "age"
4) "20"

List

Redis的list是采用来链表来存储,双向链表存储数据,特点:增删快、查询慢(Linkedlist).这个队列是有序的。

向列表左边增加元素: LPUSH key value [value …]
从列表左边弹出元素: LPOP key(临时存储,弹出后,从队列中清除)

127.0.0.1:6379> lpush alist a1 a2 123
(integer) 3
127.0.0.1:6379> lpop alist
"123"
127.0.0.1:6379> lpop alist
"a2"

向列表右边增加元素 : RPUSH key value [value …]
从列表右边弹出元素: RPOP key

127.0.0.1:6379> rpush blist a1 a2 345
(integer) 3
127.0.0.1:6379> rpop blist
"345"

获取列表中元素的个数: LLEN key

127.0.0.1:6379> llen blist
(integer) 1

查看列表语法:LRANGE key start stop
将返回start、stop之间的所有元素(包含两端的元素),索引从0开始,可以是负数,如:“-1”代表最后的一个元素。

127.0.0.1:6379> lrange blist 0 3
1) "a2"

List可以左进、右进,左出、右出。以下2个例子分别是:左进右出,右进左出。
左进右出

127.0.0.1:6379> lpush stulist stu1
(integer) 1
127.0.0.1:6379> lpush stulist stu2
(integer) 2
127.0.0.1:6379> lpush stulist stu3
(integer) 3
127.0.0.1:6379> lpush stulist stu4
(integer) 4
127.0.0.1:6379> lpush stulist stu4
(integer) 5
127.0.0.1:6379> lpush stulist stu5
(integer) 6
127.0.0.1:6379> rpop stulist
"stu1"
127.0.0.1:6379> rpop stulist
"stu2"
127.0.0.1:6379> rpop stulist
"stu3"
127.0.0.1:6379> rpop stulist
"stu4"

右进左出

127.0.0.1:6379> rpush clist stu1
(integer) 1
127.0.0.1:6379> rpush clist stu2
(integer) 2
127.0.0.1:6379> rpush clist stu3
(integer) 3
127.0.0.1:6379> rpush clist stu4
(integer) 4
127.0.0.1:6379> rpush clist stu5
(integer) 5
127.0.0.1:6379> lpop clist
"stu1"
127.0.0.1:6379> lpop clist
"stu2"

Set

Set集合类型:无序、不可重复

增加元素语法:SADD key member [member …]
删除元素语法: SREM key member [member …]
获得集合中的所有元素 : smembers key

127.0.0.1:6379> sadd ulist user1
(integer) 1
127.0.0.1:6379> sadd ulist user2
(integer) 1
127.0.0.1:6379> sadd ulist user3
(integer) 1
127.0.0.1:6379> smembers ulist
1) "user2"
2) "user3"
3) "user1"
127.0.0.1:6379> srem ulist user2
(integer) 1
127.0.0.1:6379> smembers ulist
1) "user3"
2) "user1"

判断元素是否在集合中: SISMEMBER key member

127.0.0.1:6379> smembers ulist
1) "user3"
2) "user1"
127.0.0.1:6379> sismember ulist user2
(integer) 0
127.0.0.1:6379> sismember ulist user1
(integer) 1

Zset

Sortedset又叫zset,是有序集合,可排序的,但是唯一。 Sortedset和set的不同之处,是会给set中的元素添加一个分数,然后通过这个分数进行排序。

增加元素:ZADD key score member [score member …]
向有序集合中加入一个元素和该元素的分数(score),如果该元素已经存在则会用新的分数替换原有的分数。

127.0.0.1:6379> zadd num1 20 stu1 30 stu2 40 stu3
(integer) 3

获得排名在某个范围的元素列表,并按照元素分数降序返回
语法:ZREVRANGE key start stop [WITHSCORES]

127.0.0.1:6379> zadd num1 10 stu4
(integer) 1
127.0.0.1:6379> zrevrange num1 0 4
1) "stu3"
2) "stu2"
3) "stu1"
4) "stu4"

获取元素的分数 :ZSCORE key member

127.0.0.1:6379> zscore num1 stu2
"30"

删除元素ZREM key member [member …]

127.0.0.1:6379> zrem num1 stu2
(integer) 1
127.0.0.1:6379> zrevrange num1 0 4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值