redis数据库
1.redis有什么用?
redis是一套基于内存的nosql(非关系型)数据库,日常redis+mysql。
关系型数据库:mysql,oracle,sqlserver,统一的sql标准。突出的是数据的安全,事务。缺点:大数据量情况下,查询效率(索引).
非关系型数据库: memcached,redis,hbase,mongodb
KV数据库:memcached,redis(C语言编写,单线程的操作)
文档型数据库:mongodb(存的是json对象),与mysql最相似的一套非关系型数据库,能够替代mysql。金融行业的应用。兴趣研究这个mongodb
列式数据库:hbase,大数据开发使用(亿兆级别的数据)。
主要目的为了:提高查询效率;用户高并发场景;大数据量。
2.安装redis服务端与客户端
服务端:解压版,安装版
- 核心配置文件:redis.window.conf:
配置端口:port 6379
默认数据库个数,数据库名称0-15:databases 16
rdb数据持久化策略:
save 900 1
save 300 10
save 60 10000
rdb持久化文件名:dbfilename dump.rdb
持久化文件路径:dir ./
客户端连接密码:requirepass foobared
aof数据持久化是否开启:appendonly no
aof数据库持久化文件名:appendfilename "appendonly.aof"
aof数据持久化策略:
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
rdb按照设定的时间点去持久化数据,存的是kv数据。a 10
aof每秒去持久化一次数据,存的是操作指令.set a 10
- 启动服务端:redis-server.exe
进入安装目录:redis-server.exe redis.windows.conf
- 客户端连接程序:redis-cli.exe
redis-cli.exe -h 127.0.0.1 -p 6379 -a root
- 修复aof文件用的:redis-check-aof.exe
redis-check-aof.exe --fix appendonly6379.aof
- redis-check-dump.exe
redis-check-dump.exe --fix dump6379.rdb
- 安装可视化客户端程序
redis-desktop-manager
3.redis的五种数据类型操作指令
redis相对于memcached,有丰富的数据类型。key:String,Value:String,Hash,List,Set,Zset
String:对象转成的json字符串,数字,
设置,没有时插入 set:set key value [expiration EX seconds|PX milliseconds] [NX|XX];
获取 get:get key,
数值自增1 incr:incr key,
数值自减1 decr:decr key,
数值自定义增加 incrby:incrby key increment,
数值自定义减少 decrby:decrby key decrement,
设置定时删除的信息 setex:setex key seconds value,
仅当不存在时设置setnx:setnx key value,
获取原有数值设置新数值getset:getset key value,
临时缓存一个对象:比如缓存登录用户对象;比如存储临时验证码数据;结合着ex设置超时时间一起使用
计数器:结合着incr和decr,incrby,decrby一起使用,比如秒杀商品数量,数据库自增id计数器,文件下载量,用户积分数;
分布式锁:setnx
复合指令:getset,确保原子性,执行多次redis操作
重要:set,get,incr,decr
Hash:适合获取集合中指定数据,或者全部数据应用场景
给某个key下设置field和对应的value hset:hset key field value,
获取某个key下某个field的value hget:hget key field,
获取某个key下的所有field hkeys:hkeys key,
获取某个key下的所有value hvals:hvals key,
判断key下field是否存在返回(0/1) hexists: hexists key field,
删除key下某一field hdel:hdel key field [field ...],
获取某个key下所有的filed和value hgetall:hgetall key,
获取某个key的信息条数 hlen:hlen key,
给某key下某个filed的value增加自定义数值 hincrby:hincrby key field increment,
批量获取key下的指定filed hmset:hmset key field value [field value ...],
批量设置key下的指定filed hmget hmget key field [field ...]:
存储集合型的数据,适合按照field获取指定数据,或者或者key或value的集合。
List:有序数据集,适合于获取指定索引区间的数据,获取全部数据,或者弹出数据
向key中添加value lpush:lpush key value [value ...],
弹出对应key下的一个value lpop:lpop key,
排序输出集合的start位到stop位lrange: lrange key start stop,
获取集合的长度llen:llen key,
根据index取集合的单值 lindex:lindex key index,
给已存在的index中赋值 lset:lset key index value
存储集合型的数据,适合于批量获取集合中的数据。
Set:适合于做多个集合之间的交并差操作;适合于纯随机的数据获取
给集合添加元素 sadd:sadd key member [member ...],
弹出一个元素 spop:spop key [count],
获取所有元素 smembers: smembers key,
集合之间差集 sdiff:sdiff key [key ...],
集合之间并集 sunion:sunion key [key ...],
集合之间交集 sinter:sinter key [key ...]
ZSet:排序集合,适合所有需要排名的业务(直播系统中的粉丝数排名,电商系统中销量,考虑成绩排名,对战积分排名)
zadd:插入数据
zrange:根据排名区间获取成员集合,score升序排名
zrevrange:根据排名区间获取成员集合,score降序排名
zscore:获取指定成员的成绩值。
zcount:获取指定成绩区间内的成员个数。
zrangebyscore:获取成绩区间内的成员集合,score升序排名
zrevrangebyscore:获取成绩区间内的成员集合,score降序排名
zincrby:修改集合中指定成员的成绩。
zrank:获取指定成员的排名。score升序排名。
zrevrank:获取指定成员的排名。score降序排名。
其它:
切换库:select index索引号
key的相关操作指令:
keys 获取所有key,
del 删除指定key,
exists 判断key是否存在,
type 判断key类型,
expire 设置倒计时,
ttl 查看倒计时
总结:
项目中使用redis:
热频数据:(系统用户,字典项,用户权限,热搜,首页推荐的直播)
临时数据:(验证码,使用httpsession保存的临时登录用户改为redis存)
面向大前端接口中的数据库查询:(引入redis缓存,查询的时候先查redis,redis有则返回;redis没有则查询数据库,并把查询结果放缓存)。
对于热频数据或者数据库查询结果缓存会带来的问题:
数据同步:缓存中数据与mysql数据库中的数据同步。一般update,delete仍然保持原来的mysql操作,但是需要对缓存中数据设置有效期。对于update与delete与insert操作缓存,异步线程来操作mysql数据库。
为数据设置有效期又会带来问题:
缓存的击穿:由于缓存中数据同一时刻大量失效。(在加载mysql数据到缓存设置有效期时,不要设置统一的超时时间).
常用指令:
String,Hash,List
String:set,get,incr,decr,getset
hash:hset,hget,hexists,hdel,hkeys,hvals,hlen
list:lpush,lpop,lrange
4.jedis客户端api的使用
- jedis环境
添加jedis的jar包jedis-2.7.2.jar;
添加commons-pool2.jar;
- 单机使用。
//连接池配置
JedisPoolConfig config = new JedisPoolConfig();
config.setMinIdle(10);
config.setMaxTotal(100);
config.setLifo(true);//lastinFirstOut
//创建连接池对象,该对象应该全局唯一的。
JedisPool pool = new JedisPool(config,"127.0.0.1",6379,3000,"root");
//从连接池得到一个Jedis连接对象
Jedis resource = pool.getResource();
//向redis中插入String字符串数据
Sysuser u = new Sysuser(100,"admin","1551231231","123","admin@163.com");
resource.set(u.getUphone(),JSON.toJSONString(u));
String a = resource.get(u.getUphone());
//json字符串转对象
Sysuser sysuser = JSON.parseObject(a, Sysuser.class);
System.out.println(sysuser);
resource.close();
- 客户端分片集群使用
redis的集群的产生原因:为了保证redis的高可用性(某台服务器挂了,不影响程序使用);单台redis存储的数据量有限。
redis集群方案:
客户端分片集群:redis服务器默认存在16384个哈希槽。由多台redis服务器均分这些哈希槽,不可扩展。无法确保高可用。
服务端的哨兵集群;服务端的cluster终极集群方案。
5.jedis整合ssm
properties文件
redis.minIdle=10
redis.MaxTotal=100
redis.host=127.0.0.1
redis.port=6379
redis.timeout=3000
redis.auth=root
spring配置文件中添加
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="minIdle" value="${redis.minIdle}"></property>
<property name="maxTotal" value="${redis.MaxTotal}"></property>
</bean>
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg index="0" ref="poolConfig"></constructor-arg>
<constructor-arg index="1" value="${redis.host}"></constructor-arg>
<constructor-arg index="2" value="${redis.port}"></constructor-arg>
<constructor-arg index="3" value="${redis.timeout}"></constructor-arg>
<constructor-arg index="4" value="${redis.auth}"></constructor-arg>
</bean>
其它:
在tomcat集群环境下,用户登录后服务端如何保存登录用户信息.
方案1:基于redis进行HttpSession对象的在多台tomcat服务器之间的共享,仍然使用HttpSession来存登录用户。
方案2:基于token机制,当用户首次登录服务器,由服务端生成加密token令牌返回客户端,以后客户端都携带token令牌进入服务器,服务器校验token合法性,解析token中登录用户标识,从redis中根据用户标识获取完整用户信息。