Redis学习

1.Redis介绍

1.1 什么是NoSql

为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方案,就是NoSql数据库。泛指非关系型的数据库,NoSQL即Not-Only SQL,它可以作为关系型数据库的良好补充。

1.2 Nosql数据库分类

  1. 键值(Key-Value)存储数据库
    相关产品:Redis
  2. 列存储数据库
    相关产品:HBase
  3. 文档型数据库
    相关产品:MongoDB
  4. 图形(Graph)数据库
    相关产品:Neo4J

1.3 什么是Redis

Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求。

1.4 redis的应用场景

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

2. Redis在centos中安装的方法

步骤:

  1. 下载:wget http://download.redis.io/releases/redis-3.0.0.tar.gz
  2. Redis是C语言开发,安装C环境:yum install gcc-c++
  3. 解压缩Redis源码包: tar -zxf redis-3.0.0.tar.gz 【直接解压到当前文件夹,用户目录】
  4. 编译redis源码:
    cd redis-3.0.0
    make
  5. 安装redis:make install PREFIX=/usr/local/redis(提前创建redis文件夹)

3. 两种启动redis的方式

3.1 前端启动(不推荐)

相关命令:

  1. 直接运行bin/redis-server将以前端模式启动。【bin目录是在/usr/local/redis/bin】
    ./redis-server
  2. 前端启动的关闭:ctrl+c

3.2 后端启动

相关命令:

  1. 将redis源码包中的redis.conf配置文件复制到/usr/local/redis/bin/下:
    cp redis.conf /usr/local/redis/bin/
  2. 修改redis.conf,将daemonize由no改为yes:
    vi redis.conf
  3. 执行命令: ./redis-server redis.conf
  4. 后端启动的2种关闭方式
    a: ./redis-cli shutdown (推荐)
    b: kill 5528

4. Redis的3种客户端模式

4.1 Redis自带的客户端

操作:

  1. ./redis-cli -h 127.0.0.1 -p 6379(跳到bin下,本地ip和端口可以省略)
  2. exit 【退出】

4.2 图形界面客户端redis-desktop-manager.exe(了解)

相关命令:

  1. 改防火墙端口的推荐方法,打开iptables增加对应的端口!!!
    vim /etc/sysconfig/iptables
  2. 修改后,重启防火墙就行
    service iptables restart
  3. 默认有16个数据库,切换数据库使用命令:select 数据库编号
    在这里插入图片描述

4.3 Java客户端Jedis

使用步骤:

  1. 在编译器里新建普通java项目,添加jar包
    在这里插入图片描述
  2. 方式1:单实例连接
	@Test
	public void testJedis() {
		jedis.select(1);//设置数据库
//创建一个Jedis的连接
		Jedis jedis = new Jedis("127.0.0.1", 6379);
		//执行redis命令
		jedis.set("mytest", "hello world, this is jedis client!");
		//从redis中取值
		String result = jedis.get("mytest");
		//打印结果
		System.out.println(result);
		//关闭连接
		jedis.close();	
	}

  1. 方式2:连接池连接(推荐,性能更高)
	@Test
	public void testJedisPool() {
		//创建一连接池对象
		JedisPool jedisPool = new JedisPool("127.0.0.1", 6379);
		//从连接池中获得连接
		Jedis jedis = jedisPool.getResource();
		String result = jedis.get("mytest");
		System.out.println(result);
		//关闭连接
		jedis.close();
		
		//关闭连接池
		jedisPool.close();
	}

  1. 方式3:Spring整合jedisPool(了解)

5. Redis的5种数据类型操作(重点)

:在redis中的命令语句中,命令是忽略大小写的,而key是不忽略大小写的,以下命令是在Redis自带的客户端里操作的。

  1. 字符串

赋单值:SET key value
赋多值:MSET key1 value1 key2 value2 …
取单值:GET key
取多值: MGET key1 key2 …
取值并赋值(修改): GETSET key value
删除:DEL key
递增数值:INCR key
增加指定的整数:INCRBY key 数字
递减数值:DECR key
减少指定的整数 :DECRBY key decrement
应用场景:自增主键
eg:商品编号、订单号采用string的递增数字特性生成
INCR items:id

  1. Hash类型(解决上述字符串类型在传输、处理时造成的资源浪费)

赋单值:HSET key field value
赋多值:HMSET key field1 value1 field2 value2 …
取单值: HGET key field
取多值: HMGET key1 field1 field2 …
获取所有字段值: HGETALL key
删除一个或多个字段:HDEL key field1 field2 …
增加数字:HINCRBY key field 数字
应用场景:存储商品信息
eg:商品字段【商品id、商品名称、商品描述、商品库存、商品好评】
定义商品信息的key,商品1001的信息在 Redis中的key为:[items:1001]
HMSET items:1001 id 3 name apple price 999.9

  1. List
    可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。列表类型内部是使用双向链表(double linked list)实现的。即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也是极快的。

向列表左边增加元素:LPUSH key value1 value2 value3
向列表右边增加元素:RPUSH key value1 value2 value3
查看列表: LRANGE key start stop(索引从0开始。stop=-1表示最后一个)
从列表两端弹出(删除)元素:LPOP key RPOP key
获取列表中元素的个数:LLEN key
应用场景:商品评论列表
在Redis中创建商品评论列表
用户发布商品评论,将评论信息转成json存储到list中。
用户在页面查询评论列表,从redis中取出json数据展示到页面。
eg:定义商品评论列表key:
商品编号为1001的商品评论key【items: comment:1001】
LPUSH items:comment:1001 ‘{“id”:1,“name”:“商品不错,很好!!”,“date”:1430295077289}’

  1. Set
    与列表不同在:集合中的数据是不重复且没有顺序

增加元素: sadd set1 a b c
删除元素:srem set1 b c
获得所有元素 : smembers set1
判断元素是否在集合中: sismember set1 a (在就返回1,不在返回0)
差集运算 A-B:sdiff setA setB(与顺序有关系,此处表示A-B)
交集运算 A ∩ B: sinter setA setB
并集运算 A ∪ B: sunion setA setB

  1. SortedSet(zset)
    在集合类型的基础上,有序集合类型为集合中的每个元素都关联一个分数,这使得我们不仅可以完成插入、删除和判断元素是否存在在集合中,还能够获得分数最高或最低的前N个元素、获取指定分数范围内的元素等与分数有关的操作。有序集合类型使用散列表实现,所有即使读取位于中间部分的数据也很快,不过有序集合要比列表类型更耗内存。

增加元素: zadd scoreboard 80 zhangsan 89 lisi 94 wangwu
获取元素的分数: zscore scoreboard wangwu
删除一个或多个元素: zrem scoreboard lisi
获得排名在某个范围的元素列表: zrange scoreboard 0 2(默认从小到大)zrevrange scoreboard 0 2(从大到小)
获得元素的分数:可以在命令尾部加上WITHSCORES参数
应用场景:商品销售排行榜
eg:需求:根据商品销售量对商品进行排行显示
思路:定义商品销售排行榜(sorted set集合),Key为items:sellsort,分数为商品销售量。
写入商品销售量:
商品编号1001的销量是9,商品编号1002的销量是10
ZADD items:sellsort 9 1001 10 1002
商品编号1001的销量加1
192.168.101.3:7001> ZINCRBY items:sellsort 1 1001
商品销量前10名:
192.168.101.3:7001> ZRANGE items:sellsort 0 9 withscores

6. Keys命令(了解)

Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即:到期后数据销毁。

命令:

EXPIRE key seconds 设置key的生存时间(单位:秒)key在多少秒后会自动删除
TTL key 查看key生于的生存时间
PERSIST key 清除生存时间
PEXPIRE key milliseconds 生存时间设置单位为:毫秒

7. Redis的两种持久化方案

7.1 RDB持久化(默认方式)

通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。
“save 900 1”表示15分钟(900秒钟)内至少1个键被更改则进行快照。
缺陷:一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据。如果数据很重要以至于无法承受任何损失,则可以考虑使用AOF方式进行持久化。

7.2 AOF持久化(操作一次就写一次数据)

  1. 通过修改redis.conf配置文件中的appendonly参数开启:
    appendonly yes
  2. 重启服务,再添加数据,然后会有一个aof文件:
    ./redis-cli shutdown
    ./redis-server redis.conf
    ./redis-cli

8. Redis的主从复制(掌握)

8.1 主从复制的介绍

持久化保证了即使redis服务重启也不会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可以避免这种单点故障,解决上述RDB持久化的缺陷。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.2 主从配置步骤

  1. 安装redis,原文件作为主机,复制多份主机作为从机

cp bin/ bin2 –r

  1. 修改从机的redis.conf,配置slaveof 为主机的ip地址和端口号
    在这里插入图片描述
  2. 在redis.conf中修改从机的port地址为6380
    在这里插入图片描述
  3. 清除从机中的持久化文件

rm -rf appendonly.aof dump.rdb

  1. :启动从机【一定要使用配置文件启动,否则还是使用默认的端口】
    ./redis-server redis.conf (查看两个端口启动情况:ps -ef|grep redis)
  2. 启动6380的客户端
    ./redis-cli -p 6380

注意:主机一旦发生增删改操作,那么主机会将数据同步到从机中从机不能执行写操作

9. Redis集群

9.1 redis-cluster【集群】架构图

在这里插入图片描述
解释:所有的redis节点彼此互联,不需要中间proxy层(即之前学的Nginx代理),客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

9.2 搭建Ruby环境(集群管理工具)

安装步骤:

  1. 安装ruby:

yum install ruby
yum install rubygems

  1. 使用filezilla工具上传redis-3.0.0.gem至/usr/local下
  2. 安装ruby和redis的接口程序:

gem install /usr/local/redis-3.0.0.gem

  1. 将Redis集群搭建脚本文件复制到/usr/local/redis/redis-cluster目录下:

cp redis-trib.rb /usr/local/redis/rediscluster/ -r (ll *.rb【查看rb文件)

9.3 集群的搭建过程

说明:搭建集群最少也得需要3台主机,如果每台主机再配置一台从机的话,则最少需要6台机器。
以下例子按端口设计如下:7001-7006

  1. 复制出一个7001机器,创建7001,7002,…7006文件夹

cp bin ./redis-cluster/7001 –r

  1. 如果存在持久化文件,则删除:rm -rf appendonly.aof dump.rdb
  2. 设置集群参数
    在这里插入图片描述
  3. 修改端口
    在这里插入图片描述
  4. 复制出7002-7006机器

cp 7001/ 7002 -r
cp 7001/ 7003 -r
cp 7001/ 7004 -r
cp 7001/ 7005 -r
cp 7001/ 7006 –r

  1. 修改7002-7006机器的端口
  2. 使用脚本批量启动7001-7006这六台机器

创建脚本文件startall.sh,vim 打开,粘贴单个启动的命令,然后保存退出,给文件增加执行权限
即:[root@A001redis-cluster]#vi startall.sh chmod u+x startall.sh ./startall.sh
在这里插入图片描述

  1. 创建集群
    ./redis-trib.rb create --replicas 1 192.168.237.131:7001 192.168.237.131:7002 192.168.237.131:7003 192.168.237.131:7004 192.168.237.131:7005 192.168.237.131:7006
  2. 连接集群

./redis-cli –h 127.0.0.1 –p 7001 -c【c表示集群方式连接】

  1. 查看集群状态:cluster info
  2. 查看集群中的节点:cluster nodes

10. Jedis连接集群

步骤:

  1. 防火墙配置:

service iptables stop
vim /etc/sysconfig/iptables 添加7001到7006的端口
service iptables restart

  1. 代码实现:
    创建JedisCluster类连接redis集群
@Test
public void testJedisCluster() throws Exception {
	//创建一连接,JedisCluster对象,在系统中是单例存在
	Set<HostAndPort> nodes = new HashSet<>();
	nodes.add(new HostAndPort("127.0.0.1", 7001));
	nodes.add(new HostAndPort("127.0.0.1", 7002));
	nodes.add(new HostAndPort("127.0.0.1", 7003));
	nodes.add(new HostAndPort("127.0.0.1", 7004));
	nodes.add(new HostAndPort("127.0.0.1", 7005));
	nodes.add(new HostAndPort("127.0.0.1", 7006));
	JedisCluster cluster = new JedisCluster(nodes);
	//执行JedisCluster对象中的方法,方法和redis一一对应。
	cluster.set("cluster-test", "my jedis cluster test");
	String result = cluster.get("cluster-test");
	System.out.println(result);
	//程序结束时需要关闭JedisCluster对象
	cluster.close();
}

补:也可以使用spring,这里自己查

总结

Redis是学习的第一个NoSql数据库,主要用于做缓存,基于键值对的特性存值,方便查询数据,可以用于电商平台,会使用它的5种基本数据类型,包括字符串,hash,list,set.SortedSet;他们都有自己的特性,比如列表和有序集合是有序的,集合set是唯一,无序的。另外还掌握了两种持久化方案,但都有确定,性能和安全不能兼得;因此,主从复制可以很好的解决这个问题,主要熟悉主从机的概念以及搭建的步骤,最后学习了Redis集群的搭建,极大的提升了系统的性能和安全。总之,Redis比之前学习的ehcache效率更好,至于其他的NoSql数据库,例如基于文档型数据库MongoDB,可以在需要的时候看一下,Redis与之相比各有优缺点。本教程是从初学者的角度出发,写的很细,希望对你有帮助,坚持记录知识,传递知识,共同提高!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值