五大基本数据类型
string
Listo
Seto
Hasho
Zset
三种特殊数据类型
geo
hyperloglogo
bitmap
Redis(=Remote Dictionary Server ),即远程字典服务
Redis是一个key-value 存储系统
Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
1、内存存储、持久化,内存中是断电即失、所以说持久化很重要(( rdb、aof )
2、效率高,可以用于高速缓存
3、发布订阅系统
4、地图信息分析
5、计时器、计数器(浏览量!)
6、.….
下载地址:https://github.com/tporadowski/redis/releases。
解压
开启Redis,双击运行服务即可
使用redis客户端来连接redis
1、MySQL 300万条数据的时候一定要建立索引,要不然访问速度就会变慢
cd /usr/local/bin
redis-server /etc/redis.conf
ps -ef | grep redis
redis-cli
flushdb
/要查找的字符串 //查找
:%s/要替换的字符串/新字符串 //替换
:wq! //保存退出
安装gcc
解压redis文件
进入redis目录后,使用make进行编译
安装
验证redis是否安装成功
前台启动redis(不推荐)
后台启动
修改etc目录下的文件内容
默认16个数据库,类似数组下标从o开始,初始默认使用o号库,
使用命令select来切换数据库。如: select 8
所有库的密码相同
串行vs多线程+锁( memcached ) vs单线程+多路Io复用(Redis).
(与Memcache三点不同:支持多数据类型,支持持久化,单线程+多路IO复用)
1、 keys *查看当前库所有key
2、 exists key判断某个key是否存在
3、 type key查看你的 key是什么类型
4、 del key删除指定的key数据·
unlink key根据value选择非阻塞删除仅将keys 从 keyspace元数据中删除,真正的删除会在后续异步操作。
5、 expire key 10 10秒钟:为给定的 key设置过期时间
6、 ttl key查看还有多少秒过期,-1表示永不过期,-2表示已过期。
其他命令
dbsize查看当前数据库的key的数量
flushdb清空当前库
flushall通杀全部库
String是 Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
String类型是二进制安全
的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M
常用命令
1、 set :set key value设置相同的key将覆盖先前的值
2、 get:get key
3、 append key value将给定的value追加到原值的末尾。
4、 strlen key获得值的长度
5、 setnx key value只有在key 不存在时才设置key的值,存在时不设置
6、 incr key
将key中储存的数字值增1
只能对数字值操作,如果为空,新增值为1
7、 decr key
将key 中储存的数字值减1
只能对数字值操作,如果为空,新增值为-1
8、 incrby / decrby key 步长 将key中储存的数字值增减。自定义步长。
简介
Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
Redis的set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)。
一个算法,随着数据的增加,执行时间的长短,如果是O(1),数据增加,查找数据的时间不变。
常用命令
数据结构
Set数据结构是dict字典,字典是用哈希表实现的。
Java中HashSet的内部实现使用的是 HashMap ,只不过所有的value都指向同一个对象Redis的set结构也是一样,它的内部也使用hash结构,所有的value都指向同一个内部值。,
Redis hash是一个键值对集合。·
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。类似Java里面的Map
用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储
主要有以下2种存储方式:
Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分( score) ,这个评分( score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了。
因为元素是有序的,所以你也可以很快的根据评分( score )或者次序( position )来获取一个范围的元素。
访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。
1、单位
配置大小单位,开头定义了一些基本的度量单位,只支持(字节)bytes,不支持bit,大小写不敏感
2、包含
3、网络
4、tcp-backlog 511
5、timeout
6、tcp-keepalive 300
检测连接,间隔为300s
7、pidfile /var/run/redis_6379.pid保存进程号
8、log级别
9、日志的输出路径
10、SECURITY
11、限制
什么是发布和订阅
Redis发布订阅(pub/sub) 是一种消息通信模式 :发送者(pub) 发送消息,订阅者(sub)接收消息。Redis客户端可以订阅任意数量的频道。
虚拟机防火墙问题
解决
查看防火墙是开启状态
关闭防火墙
成功连接
Redis事务是一个单独的隔离操作∶事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
Redis事务的主要作用就是串联多个命令防止别的命令插队。
组队中某个命令出现了报告错误,执行时整个的所有队列都会被取消。
情况一:组队时就失败
情况二:组队成功,但是执行失败
一个请求想给金额减8000.
—个请求想给金额减5000.
一个请求想给金额减1000.
悲观锁(Pessimistic Lock),顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁↓这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
乐观锁(Optimistic Lock),顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis 就是利用这种check-and-set机制实现事务的。·
在指定的时间间隔
内将内存中的数据集快照
写入磁盘,也就是行话讲的 Snapshot 快照,它恢复时是将快照文件直接卖到内存里
12.2.3.备份是如何执行的
Redis,会单独创建( fork )一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
14.1.是什么。
主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,slave以读为主
14.2.能干嘛
读写分离,性能扩展
容灾快速恢复:当有一台服务器垮掉了,可以从另一台读
启动三个服务
从服务器挂掉之后再重启就变成了主服务器
需要重新加入主服务器,加入后主服务器的数据自动同步到从服务器
主服务器挂掉后,其中的一个从服务器会自动编程主服务器,原主服务器再启动时,不再是主服务器,而是变成从服务器
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
修改每一个文件
redis-cli --cluster create --cluster-replicas 1 192.168.171.194:6379 192.168.171.194:6380 192.168.171.194:6381 192.168.171.194:6389 192.168.171.194:6390 192.168.171.194:6391
得到一个值:16384 slots covered
连接集群并查看集群主从情况
//jedis操作集群
@Test
public void testJedisColony() throws Exception {
//创建对象
HostAndPort hostAndPort = new HostAndPort("192.168.171.195", 6379);
JedisCluster jedisCluster = new JedisCluster(hostAndPort);
//进行操作
jedisCluster.set("b1", "value1");
String value = jedisCluster.get("b1");
System.out.println("value == "+value);
//关闭
jedisCluster.close();
}