redis入门
redis入门Nosq概述redis安装下载redis测试性能基础知识Redis-Key的基本命令redis基本数据类型之Stringredis基本数据类型之Listredis基本数据类型之setredis基本数据类型之hashredis基本数据类型之Zset(有序集合)redis特殊数据类型之geospatial(地理位置)redis特殊数据类型之Hyperloglogredis特殊数据类型之Bitmapsredis事务乐观锁通过Jedis操作redisSpringboot整合redis.conf详解redis持久化(重点)redis持久化之RDB(redis DataBase)redis持久化之AOF(Append Only File)redis发布和订阅Redis主从复制(重点)环境配置哨兵模式(自动选举master)redis缓存穿透和雪崩
Nosq概述
Nosql特点:
方便扩展(数据之间没有关系,很好扩展)
大数据量高性能
数据类型是多样的(不用设计数据库)
RDBMS和NoSQL:
传统RDBMS-结构化组织-SQL-数据和关系都存在单独的表中-数据定义语言-基础的事务NoSQL-没有固定的查询语言-键值对存储、列存储、文档存储、图形数据库-最终一致性-CAP定理和BASE-高性能、高可用、高扩展
redis
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
安装下载redis
yum -y install gccyum -y install gcc-c++wget http://download.redis.io/releases/redis-5.0.7.tar.gz$ tar xzf redis-5.0.7.tar.gzcd redis-5.0.7make distclean 清除缓存[root@kzl redis-5.0.7]# make[root@kzl redis-5.0.7]# make PREFIX=/usr/local/redis-5 install配置环境变量:[root@kzl ~]# vi /etc/profileexport REDIS_HOME=/usr/local/redis-5export PATH=$PATH:$REDIS_HOME/bin[root@kzl ~]# . /etc/profile[root@kzl ~]# mkdir myconfig[root@kzl ~]# cp redis-5.0.7/redis.conf myconfig[root@kzl ~]# vim redis.configdaemonize yes#启动redis[root@kzl ~]# cd /usr/local/redis-5/bin/[root@kzl bin]# redis-server /root/myconfig/redis.conf#测试:[root@kzl bin]# redis-cli -p 6379ping
测试性能
redis-benchmark是一个压力测试
redis-benchmark 命令参数:
[root@kzl ~]# redis-benchmark -h localhost -p 6379 -c 100 -n 10000
基础知识
databases 16默认有16个数据库
基本操作
127.0.0.1:6379> select 3 #切换数据库127.0.0.1:6379[3]> keys * #查看所有的key127.0.0.1:6379[3]> flushdb #清空当前数据库127.0.0.1:6379[3]> FLUSHALL #清空所有数据库
redis为什么单线程还这么快:
redis是将所有的数据全部放在内存中,所以说使用单线程去操作效率就是最高的,多线程在CPU 上下文切换的时候会降低效率,对于内存系统来说,如果没有上下文切换效率就是最高的。
Redis-Key的基本命令
127.0.0.1:6379> set key value #设置key和value值127.0.0.1:6379> exists key #判断当前key是否存在127.0.0.1:6379> move key value #移除key中的value值127.0.0.1:6379> expire key 10 #设置key的过期时间,单位秒127.0.0.1:6379> ttl key #查看key存活时间127.0.0.1:6379> get key #获取key值127.0.0.1:6379> type key #查看当前key的类型
redis基本数据类型之String
127.0.0.1:6379> append key value #追加字符串,如果当前key不存在,则相当于set key127.0.0.1:6379> strlen key #获取key的值的字符串长度#自增自减127.0.0.1:6379> incr key #自增127.0.0.1:6379> decr key #自减127.0.0.1:6379> incrby key 步长 #自增"步长"127.0.0.1:6379> decrby key 步长 #自减"步长"#截取字符串127.0.0.1:6379> getrange key start end #截取字符串[start,end]127.0.0.1:6379> getrange key 0 -1 #查看所有的字符串和get key一样#替换127.0.0.1:6379> setrange vkey start value #从start开始替换字符串为value#设置过期时间和设置不存在则创建#setex(set with expore) #设置过期时间#setnx(set if not exist) #不存在则设置127.0.0.1:6379> setex key seconds value #设置key和value值,只存在seconds127.0.0.1:6379> setnx key value #设置key和value,当key值不存在的时候#同时设置多个值127.0.0.1:6379> mset k1 v1 k2 v2 ... #同时设置多个key和value127.0.0.1:6379> msetnx k1 v1 k2 v2 ... #同时设置多个值,是一个原子操作,要么一起成功,要么一起失败#对象127.0.0.1:6379> mset object:{id}:{filed} value... #设置对象的值 id表示序列号127.0.0.1:6379> mget object:{id}:{filed}... #获取对象的字段id与上面一样#getset先获取再设置getset key value #如果没有key,则输出nil,如果有key,输出旧value,设置value值
redis基本数据类型之List
在redis可以用List设置成队列、栈、阻塞队列
所有的List都是以l开头
#lpush和rpush127.0.0.1:6379> lpush key value #将一个或多个值,插入到集合头部(左)127.0.0.1:6379> lrange key start end #获取key列表的值[start,end]127.0.0.1:6379> rpush key value #将一个或多个值,插入到集合尾部(右)#lpop和rpop127.0.0.1:6379> lpop key #移除集合头元素(左)127.0.0.1:6379> rpop key #移除集合尾元素(右)#Lindex127.0.0.1:6379> lindex key number #获取下标为number的值#Llen127.0.0.1:6379> Llen key #返回集合长度#Lrem127.0.0.1:6379> Lren key number value #移除key集合中number个value值(精确匹配)#Ltrim127.0.0.1:6379> Ltrim key start end #截取[start,end]的元素,并将value值设置到该集合中#rpoplpush127.0.0.1:6379> rpopLpush source destination #移除source最后一个元素,添加到destination的第一个元素#lset 更新127.0.0.1:6379> lset key index value #将列表的下标index的旧value替换为value。该集合必须存在且index的值不为nil(null)#Linsert127.0.0.1:6379> Linsert key before|after pivot value #插入value,