redis支持的简直数据类型:字符串类型、列表类型、有序集合类型、散列类型、集合类型
redis读写效率:读每秒十一万次,写每秒八万次
二:redis应用场景
1.缓存
2.聊天室,秒杀,任务队列(list结构,pop(弹出),push(插入))
3.数据存储(add,del,update,select)定期持久化到硬盘中
4.网站统计
5.数据过期处理
6.分布式集群架构中的session分离
三:redis安装
建议安装在Linux上.教程自己搜一个即可,这里不在总结.
四:redis命令存值和取值,以及通过键删除..一般很少用,都是用程序存取.
五:jedis使用,一个redis客户端.
jedis介绍:redis官方首选的Java客户端开发包.可以去githup下载安装包
六:Java项目存入redis入门程序
@Test//没有使用连接池
public void demo1(){
Jedis jedis = new Jedis("127.0.0.1",6379);
jedis.set("name", "test");
String name = jedis.get("name");
System.err.println(name);
jedis.close();
}
@Test//使用连接池
public void demo2(){
//连接池配置对象
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(30);
config.setMaxIdle(10);
//获得连接池
JedisPool jedisPool = new JedisPool(config,"127.0.0.1",6379);
//jedis核心对象
Jedis jedis = null;
try{
//通过连接池获得jedis对象
jedis = jedisPool.getResource();
jedis.set("name", "test");
String value = jedis.get("name");
System.out.println(value);
}catch(Exception e){
e.printStackTrace();
}finally{
//释放资源
if(jedis != null){
jedis.close();
}
if(jedisPool != null){
//释放连接池对象
jedisPool.destroy();
}
}
}
linux防火墙对连接的影响以及对于属性修改
1).打开linux防火墙6379端口:vim etc/sysconfig/iptables(复制yy,粘贴t,复制已开端口22那行)
2).重启防火墙:service iptables restart
七:redis的数据结构:
字符串,哈希(hash),字符串列表(list),字符串集合(set),有序字符串集合(sorted set)
key的命名应该遵循以下原则:
1. 不要过长,最好不要超过1024个字节。过长的key不仅仅会占用更多的内存,还会影响查找的效率。
2. 不要过短,太短的key可能会导致可读性降低。
3. 最好遵循一致的命名规范。
Redis数据类型之字符串
支持的操作:
1. set:赋值;
2. get:取值;
3. getset:getset 属性 属性值 先得到再设置;
4. del:删除;
5. incrby:incrby 属性名 加数字 设置一次加几;
6. decrby:decrby 属性名 加数字 设置一次减几;
7. incr:incr 属性 如果属性不存在 默认为0在加一;
8. decr:decr 属性 如果属性不存在 默认为0再减一;
9. append:append 属性 加字符串 在原来的属性后面追加字符串 返回值是整个字符串的长度;
Redis数据类型之hash:
1. 一个用于存储键值对的map容器,键和值均为字符串类型;
2. 单个容器中最多可以存储(2^32 - 1)个键值对;
常用命令:
赋值:hset、hmset
hset userame jack
hmset username jack age 18
取值:hget、hmget,hgetall
hget myhash username
hget myhash username age
hgetall myhash
删除:hdel、del
hdel myhash username
hdel myhash username age
del myhash
增加数字:hincrby
hincrby myhash age 5
自学命令:判断存在hexists、获得属性hlen、获得所有key、获得所有值hvals
hexists myhash username
hlen myhash
hkeys myhash
hvals myhash
redis数据结构list
存储list:
1. ArrayList使用数组方式存储
2. LinkedList使用双向链表存入数据
3.双向链表增加数据
4.双向链表删除数据
存储list常用命令:
1.两端添加:lpush、rpush
lpush list 1 2 3 #从左侧往list表中插入1 2 3
rpush list a b c #从右侧忘list表中插入a b c
2.查看列表:lrange
lrange list 0 -1 #从头到尾查看
lrange list 0 5 #从开始到第5个查看
3.两端弹出:lpop、rpop弹出之后列表里面就没了
lpop list #从左边弹出第一个数
rpop list #从尾部弹出第一个数
4.获取列表元素个数:llen
llen list #查看元素个数
5.扩展命令:lpushx、rpushx、lrem、lset、rpoplppush
lpushx list x #插入x到list表的开头
rpushx list y #插入y到list表的尾部
lrem list 2 3 #从头到尾删除2个3
lrem list -2 1 #从尾到头删除2个1
lrem list 0 2 #删除所有2
lset list 3 mmm #在list表第3个角标设置mmm
linset list before a yy #在list表中a之前插入yy
linset list after b xx #在list表中b之后插入xx
rpoplpush list1 list2 #将list1表的开头压入到list2表的结尾:讲list1弹出压入到list2
应用场景一半为消息队列
redis数据结构set
概述:存储Set
和List类型不同的是,Set集合中不允许出现重复的元素
Set可包含的最大元素数量是4294967295
存储set常用命令:
1.添加/删除元素:sadd、srem
sadd set a b c
srem set a b c
2.获得集合中的元素:smembers、sismember
smembers set
sismember set a #判断set集合中是否有a
3.集合中的差集运算:sdiff
sdiff set1 set2 #集合set1和集合set2存在的差集
4.集合中的交集运算:sinter
sinter set1 set2
5.集合中的并集运算:sunion
sunion set1 set2,重复会去掉
6.扩展命令:
scard set #获取set集合中的个数
srandmember set1 随机返回集合元素
sdiffstore db1 set1 set2 #将set1和set2差集存到db1中
sinterstore db2 set1 set2 #将set1和set2交集存到db2中
sunionstore db3 set1 set2 #将set1和set2并集存到db3中
存储Set使用场景:(访问博客的ip,客户的交集)
跟踪一些唯一性数据
用于维护数据对象之间的关联关系,比如所有购买一种商品的客户,两种商品都购买 的客户
存储Sorted-Set
1.Sorted-Set和Set的区别
sorted-set:每个成员都有一个分数与之关联,成员唯一,可以对应多个分数
2.Sorted-Set中的成员在集合中的位置是有序的
存储Sorted-Set常用命令:
1.添加元素:zadd
zadd mysort 10 a 20 b 30 c #a的分数是10、b的分数是20、c的分数是30
返回的是添加成功的元素,如果有了就不会添加成功(返回0)
2.获得元素:zscore获得分数、zcard获得成员数量
zscore mysort a #获得a的分数
zcard mysort #获得集合成员数量
3.范围查询:zrange
zrange sort 0 -1 #所有成员
zrange sort 0 -1 withscores #查询成员及分数,从小到大
zrevrange sort 0 -1 withscores #从大到小
4.删除元素:zrem、zremrangebyrank按照排名范围删除、zremrangebyscore按照分数范围删除
zrem sort a b #删除成员a、b
zremrangebyrank sort 0 4 #删除排名0-4的成员
zremrangebyscore sort 10 30 #删除分数10-30的成员
5.扩展命令:
zrangebyscore sort 0 100 withscores #显示0-100分数的成员
zrangebyscore sort 0 100 withscores limit 0 2 #显示0-100分数的成员的前两名
zincrby sort 10 c #给c加上10
zcount sort 80 100 # 显示80-100分数的成员个数
Sorted-Set使用场景:
主要应用场景为游戏排名或者微博阅读话题量
构建索引数据
操作key的常用命令:
(1)所有键列:keys *
(2)指定开头键列:keys [*]?
(3)删:del 键...
(4)判断存在:exists 键 1代表存在,0代表不存在
(5)重命名:rename 旧键名 新键名
(6)设过期时间:expire 键 [seconds]
(7)查过期时间:ttl 键(查看剩余超时时间,没设置返回-1)
(8)键的值类型:type 键
(9)清空缓存:flushall
redis特性:
多数据库:
最多有16个数据库 0 -15客户端可指定连接某个数据库 默认为0
select 0 连接第一个数据库
move myset 1 将myset号数据库移到1号数据库
multi(相当于开启session) exec(提交) discard(回滚) 事务串行 某个失败后面继续
Redis事务
开启事务会将任务放到queue中,当提交事务时逐个执行
multi(相当于开启session) exec(提交) discard(回滚) 事务串行 某个失败后面继续
multi:开启事务
exec:提交,执行的命令被原子化执行
discard:回滚
Redis持久化
数据从内存同步到硬盘
两种持久化方式:
RDB方式
AOF方式
持久化使用的方式:
1.RDB方式:
默认支持,在指定的时间间隔内,将内存中的数据集快照写入到磁盘
2.AOF方式:
日志的形式记录服务器处理的每一个操作,服务器启动之初,读取文件,重新构建数据库
3.无持久化
通过配置继用Redis持久化功能,Redis缓存机制
4.同时使用RDB和AOF
RDB
优势:
1.数据库只包含一个文件,通过文件备份策略,定期配置,恢复系统灾难
2.压缩文件转移到其他介质上
3.性能最大化,redis开始持久化时,分叉出进程,由子进程完成持久化的工作
,避免服务器进程执行I/O操作,启动效率高
劣势:
1.无法高可用:系统一定在定时持久化之前宕机,数据还没写入,数据已经丢失
2.通过fock分叉子进程协助完成工作,数据集大的时候,服务器需要停止几百毫秒甚至1秒
配置:
cd /usr/local/redis
vim redis.conf
默认:
save 900 1 #每900秒至少1个key变化,持久化一次,到内存一个快照
save 300 10 #每300秒至少10个key变化,往硬盘写一次
save 60 10000 #每60秒至少10000个key变化,写一次
dbfilename dump.rdb #数据的文件名
dir ./ #保存的路径,redis路径下 ./表示当前路径下
AOF
优势:
1.同步:
a.每秒同步:异步完成,效率高,一旦系统宕机,修改的数据丢失
b.每修改同步:同步持久化,每分钟发生的变化记录到磁盘中,效率低,安全
c.不同步
2.日志写入操作追加模式append
a.系统宕机,不影响存在的内容
b.写入一半数据,若系统崩溃,下次启动redis,redis-check-aof工具解决数据一致性
3.如果日志过大,自动重写机制,修改的数据写入到到磁盘文件,创建新文件,记录产生的修改命令,重写切换时,保证数据安全
4.格式清晰的日志文件,完成数据的重建
劣势:
1.对于相同数据文件,相比RDB,AOF文件较大
2.效率低
配置:
vim redis.conf
默认:
appendonly no #AOF方式默认关闭
appendfilename appendonly.aof #配置文件
#appendfsync always #每修改一次,同步到磁盘上
appendsync everysec 每秒同步到磁盘一次
#appensync no 不同步
实践打开AOF:
appendonly yes
appendfsync always
终端2:先断开redis
./bin/redis-cli
shutdown
启动redis:
./bin/redis-server ./redis.conf
终端1:set name 100
终端2:产生appendonly.aof文件
终端1:flushall 清空数据库
终端2:
./bin/redis-cli shutdown
vim appendonly.aof
删除flushall
./bin/redis-server ./redis.conf
./bin/redis-cli
keys *
数据还原