1:redis简介
Redis是一种面向“键/值”对数据类型的内存数据库,可以满足我们对海量数据的读写需求
redis的键只能是string类型
redis的值支持多种数据类型
1:字符串:string
2:哈希:hash
3:字符串列表:list
4:字符串集合:set(不重复,无序)
5:有序集合:sorted set(不重复,有序)
特点:
高性能(Redis读的速度是11W次/s,写的速度是8.1W次/s)
原子性(保证数据的准确性)
持久存储(两种方式RDB/快照,AOF/日志)
主从结构(master-slave,负载均衡,高可用)
支持集群(3.0版本)
应用:应用高并发和实时请求的场景
新浪微博
hash:关注列表,粉丝列表
string:微博数,粉丝数(避免使用select count(*) from ...)
sorted set:TopN,热门微博
还有github,stackoverflow等也用到了redis
2:环境搭建
首先安装c语言的编译环境(有的linux系统中可能已经有了c语言编译环境,直接执行make命令就可以)
参考
yum -y install cpp
yum -y install binutils
yum -y install glibc
yum -y install glibc-kernheaders
yum -y install glibc-common
yum -y install glibc-devel
yum -y install gcc
yum -y install make
如果上面的软件都安装了之后再执行make命令还报错,就需要在make命令后面加个选项了
make MALLOC=libc 指定内存分配器,默认是使用jemalloc
3:redis安装部署(单机)
redis官网:
http://redis.io/下载redis压缩包
解压: tar -zvxf redis
-3.0.0.tar.gz
编译、安装
make
make install
拷贝配置文件
cp redis/redis.conf /etc/(拷贝
到这里只是为了方便以后使用)
修改配置文件
daemonize yes(后台运行)
logfile /usr/local/redis/log(日志文件,目录必须存在)
启动
redis-server /etc/redis.conf [--port 6379]:中括号里面的东西可以省略,系统默认就是这个。
redis客户端
redis-cli [-h 127.0.0.1] [-p 6379]
关闭
shutdown然后 exit/quit
4:redis的特性【多数据库】
多数据库:
每个数据库对外都是一个从0开始的递增数字命名,不支持自定义的
redis默认支持16个数据库,可以通过配置文件修改
redis默认选择的是0号数据库
SELECT数字:可以切换数据库
多个数据库之间并不是完全隔离的,flushall
flushall:清空redis实例下的所有数据
flushdb:清空当前数据库中的所有数据
5:redis基础命令
获得符合规则的键名称
keys表达式(?,*,\?)
判断一个键是否存在
exists key
删除键
del key
del key1 key2
活动键值的数据类型type
返回值可能是五种类型(
string,hash,list,set,zset
)
注意:redis的命令不区分大小写
redis的help命令
"help <command>" for help on <command>
6:redis数据类型之string
字符串类型是redis中最基本的数据类型,它能存储任何形式的内容,包含二进制数据,甚至是一张图片(二进制内容)。一个字符串类型的值存储的最大容量是1GB
命令
set/get(setnx)------设置/获取数据
mset/mget------一次设置/获取多个数据
incr/decr/incrby/decrby/incrbyfloat------递增/递减
append------追加vlaue值
strlen------查看值的长度
7:redis数据类型之hash
hsah类型的值存储了字段和字段值的映射,字段和字段值只能是字符串,不支持其他类型。hash类型的键至多可以存储2^32-1个字段
hash类型适合存储对象
redis可以为任何键增减字段而不影响其他键
命令
hset/hget/hmset/hmget/hgetall(hsetnx)
hexists------判断键中的属性是否存在
hincrby(hash类型中只有hincrby命令)
hdel
hkeys/hvals------获取键/值
hlen(获取键中包含多少个字段)
8:redis数据类型之list
list是一个有序的字符串列表 ,列表内部实现是使用双向链表(linked list)实现的
list还可以作为队列使用
一个列表类型的键最多容纳2^32-1个元素
命令
lpush/rpush/lpop/rpop
llen/lrange(-1表示最后一个元素)
lindex------查询指定角标数据
lset------修改
ltrim------截取,保留指定数据
rpoplpush------将元素从一个列表转到另一个列表
9:redis数据类型之set
set集合的元素都是不重复的,无序的,一个集合类型键可以存储至多2^32-1个元素
set集合类型和list列表类型的相似之处
命令
sadd/smembers/srem/sismember
sdiff(差集)/sinter(交集)/sunion(并集)
sidffstore/sinterstore/sunionstore
scard(获取集合长度)/spop(随机从集合取出并删除一个元素)
srandmember key [count]
如果count为整数,且小于集合基数,那么命令返回count个元素的数组,数组中的元素各不相同。如果count大于等于集合基数,那么命令返
回整个集合
如果count为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为count的绝对值
10:redis数据类型之sorted set
有序集合,在集合类型的基础上为集合中的每个元素都关联了一个分数,这样可以很方便的获得分数最高的N个元素(topN)。
命令
zadd/zscore/zrange/zrevrange/
zrangebyscore(默认是闭区间,可使用"("使用开区间)
zincrby/zcard/zcount(获取指定分数范围的元素个数)
zrem
扩展:
+inf(正无穷) -inf(负无穷)
易错点
set命令
(如果key已经持有其他类型值,set就覆盖旧值,无视类型)
11:java操作redis
使用jedis第三方jar包操作redis
数据库连接方式
单机连接方式
单机连接池方式
多机分布+连接池方式
12:redis中键的生存时间(expire)
redis中可以使用expire,命令设置一个键的生存时间,到时间后redis会自动删除它。
expire------设置生存时间(单位秒)
ttl------查看键的剩余生存时间
persist------取消生存时间
expireat [key] unix 时间戳
应用场景
限时优惠活动
网站数据缓存(对于一些需要定时更新的数据,例如:积分排行榜)
手机验证码
限制网站访客访问频率
13:redis的事物(transaction)
redis中的事务是一组命令的集合,事务同命令一样都是redis的最小执行单元,一组事务中的命令要么都执行,要么都不执行。
原理:先将属于一个事务的命令发送给redis进行缓存,最后再让redis依次执行这些命令。
应用场景
一组命令都执行或都不执行
保证一组命令在执行的过程中没有其他,命令的插入
命令
multi 事务开始
.....
exec 事务结束,开始执行事务中的命令
discard 放弃事务
错误处理
语法错误:致命的错误,事务中的所有命令都不执行
运行错误:不会影响事务中其他命令的执行
Redis不支持回滚(roll back)
正因为redis不支持回滚功能,才使得redis在事务上可以保持简洁和快速。
java代码手工实现incr递增命令
watch命令
作用:监控一个或者多个键,当被监控值被修改后阻止之后的一个事务的执行。
但是不能保证其它客户端不能修改这一键值,所以我们需要在事务执行中的命令。
注意:执行完事务的exex命令,watch就会取消对所有键值的监控
unwatch:取消监控
14:redis中数据的排序(sort)
sort命令可以对列表类型,集合类型和有序集合类型进行排序
sort key [desc] [limit offset count]
by 参考键(参考键可以是字符串类型或者是hash类型的某个字段,hash类型的格式为:键名->字段名)
如果参考键中不带*号则不排序
如果某个元素的参考键不存在,则默认参考键的值为0
扩展get参数
get参数的规则和by参数的规则一样
get #------返回元素本身的值
扩展store参数
使用store参数可以把sort的排序结果保存到指定的列表中
性能优化
1:尽可能的减少待排序键中元素的数量
2:使用limit参数中获取需要的数据
3:如果排序的数据量很大,尽可能使用store参数将结果缓存。
15:”发布/订阅“模式
发布:publish
订阅:subscribe
16:redis任务队列
任务队列;使用lpush和rpop(brpop)可以实现普通任务队列。
优先级队列:
brpop key1 key2 key3 timeout
17:redis管道(pipeline)
redis中的pipeline(管道)功能在命令行中没有,但是redis是支持管道的,在java客户端(jedis)中是可以使用的。