Redis是什么
- Redis(Remote Dictionary Server):远程字典服务
- 是一个开源的使用C语言编写、支持网络、可基于内存亦可持久化的日志型、key-Value数据库,提供有多种语言的API
- 当下最热门的NoSQL技术之一,也被人们称之为结构化数据库
Redis能干什么
- 内存存储、持久化(内存中是断电即失,所以持久化很重要)
- 效率高,可以用于高速缓存
- 发布订阅系统
- 地图信息分析
- 计时器、计数器、浏览量
Redis的特性
- 多样的数据类型
- 可以持久化
- 事务功能
- 可以做集群
Windows下安装
- 下载
- 解压到自己的环境目录
- 在环境目录中运行:redis-server.exe redis.windows.conf
- 进入redis-cli.exe,输入ping,测试连接
Linux下安装
- 下载压缩包:wget http://download.redis.io/releases/redis-5.0.8.tar.gz
- 解压到opt路径下:tar -zxvf redis-5.0.8.tar.gz
- 安装gcc:yum install gcc-c++
- cd /redis-5.0.8 —> make
- make install
- linux会默认安装到 /usr/local/bin
Linux下Redis配置
- /usr/local/bin下创建用于保存自己的配置文件的目录:mkdir myconfig
- 将Redis的配置文件拷贝过来:cp /opt/redis-5.0.8/redis.conf myconfig
- 文件中monize no改为monize yes,从而以后台方式启动
Linux下启动Redis
- /usr/local/bin下执行:redis-server myconfig/redis.conf 启动Redis
- /usr/local/bin下执行:redis-cli -h host -p port -a password 进入Redis客户端
- 客户端执行shutdown然后exit 关闭Redis并退出客户端
Redis benchmark
官方自带的性能测试工具
-
测试:100个并发连接 100000请求
/usr/local/bin下执行:redis-benchmark -h localhost -p 6379 -c 100 -n 100000
Redis基本命令
以下命令都是在Redis客户端下执行的
-
Redis默认有16个数据库,0-15号,默认使用的是第0号
select n(select 3)命令:进行数据库的切换
-
dbsize命令:查看当前数据库大小
-
keys *命令:查看当前数据库所有的key
-
set key_name key_value:向当前数据库增加一个key
-
flushdb命令:清空当前数据库
-
flushall:清空全部数据库
-
exists key_name:若key存在,返回1,否则返回0
-
mave key_name:移除目标key
-
expire key_name num(阿拉伯数字):为目标key设置过期时间
-
ttl key_name:查看目标key剩余时间
-
type key_name:查看目标key的类型
Redis数据类型
五大基本数据类型
-
String
使用场景:String类型的value除了字符串还可以是数字;故可以用于实现计数器、统计单位的数量、对象缓存、网页缓存
常用命令:
- append key_name value:向目标key后追加内容,若key不存在,就相当于新增了一个key
- strlen key_name:查看目标key所对应值的长度
- incr key_name:目标key值+1,可以用于实现网站的实时数据,如阅读量(key值为数字时,Redis后台会自动转换为Integer后再操作)
- decr key_name:目标key值-1
- incrby/decrby key_name num(阿拉伯数字):增/减指定数值
- getrange key_name num1 num2:获取字符串区间
- setrange key_name num xx:从num起修改字符串的值为xx
- mset k1 v1 k2 v2 k3 v3:一次设置多个key
- mget k1 k2 k3:一次获取多个value
- mset、mget是原子性操作,要么全部成功,否则失败
- setex key_name num key_value:创建目标key,同时设置过期时间
- setnx key_name key_value:不存在此key的情况下,再创建目标key
- set user:1 {name:waston,age:3}:设置一个user:1对象 值为json字符串
- set item:{id}:value:如set book:3:views,3号书的浏览量
- getset key_name value:先get目标key,再向目标key设置value值
- lset list_name index value:向目标list的指定下标放值,该list与下标必须存在!
-
List
Redis里,list底层数据结构是链表,可以作为栈、队列、阻塞队列使用
使用场景:消息队列
常用命令:
list_name在Redis中还是以key的形式储存
- lpush list_name value:向目标list左边(头部)添加value
- rpush list_name value:向目标list右边(尾部)添加value
- lrange list_name num1 num2:查看目标list里的值;lrange list_name 0 -1:查看全部
- lpop list_name:目标list在左边(头部)弹出一个值
- rpop list_name:目标list在右边(尾部)弹出一个值
- lindex list_name num(从0开始):获取目标list左数第num+1个值
- llen list_name:获取list长度
- lrem list_name value:移除目标list中的全部value
- lrem list_name num value:移除目标list中num个value,从左往右
- ltrim list_name num1 num2:截取目标list;保留num1到num2这部分的值
- rpoplpush a_list b_list:从a_list右边弹出一个值,并放到b_list中
- linsert list_name before/after value1 value2:向目标list中value1左/右添加value2
-
Set
Set中的值不能重复
使用场景:用户间共同关注、共同爱好等共同属性的展示;好友推荐
常用命令:
- sadd set_name value:向目标set添加一个元素
- smembers set_name:查看目标set中的元素
- sismember set_name value:判断value是否在目标set中(1:存在 0:不存在)
- scard set_name:目标set中的元素个数
- srem set_name value:移除目标set中的value元素
- srandmember set_name (num):从目标set中随机取出一个(num个)元素
- spop set_name:从目标set中随机弹出一个元素
- smove set1 set2 value:将set1中的value移动到set2
- sdiff set1 set2:返回set1中有但set2没有的元素
- sinter set1 set2:返回set1与set2中共同拥有的元素
- sunion set1 set2:返回set1与set2中所有的元素,相同元素只返回一个
-
Hash
Map集合,key-map;本质和String类型没有太大区别,string中的value变成了key-value
hash更适合对象的存储,string更适合一般字符串的存储
使用场景:用一个hash储存一个用户一系列的信息
常用命令:
- hset hash_name key_name value:创建一个hash
- hget hash_name key_name:获取目标hash中目标key对应的value
- hmset hash_name k1 v1 k2 v2:创建多个值
- hmget hash_name k1 k2 :获取多个值
- hdel hash_name key_name:删除目标hash中的目标key及对应的value
- hlen hash_name:查看目标hash中有多少个key
- hexists hash_name key_name:判断目标hash中目标key是否存在
- hkeys hash_name:查看目标hash中的所有key
- hvals hash_name:查看目标hash中的所有value
- hincrby hash_name key_name 1/-1:使目标key的value+1或-1
- hsetnx hash_name key_name value:目标key不存在时进行创建
-
Zset
有序集合
在set的基础上增加了一个值,用于排序
使用场景:排行榜、数据加权
常用命令:
- zadd set_name score value:创建目标zset,并增加一个值score
- zadd set_name n1 v1 n2 v2:创建多个,eg:zadd salary 100 sam 200 kim
- zrangebyscore set_name -inf +inf:目标zset按score排序升序输出,范围为-inf至+inf,表示正负无穷即全范围
- zrevrange set_name +inf -inf:降序输出
- zrangebyscore set_name -inf +inf withscores:排序输出并附带score
- zrem set_name value:移除目标zset中的指定元素
- zcard set_name:获取zset中元素的个数
- zcount set_name num1 num2:获取num1至num2之间的元素的个数
三种特殊类型
-
geospatial
地理位置;底层由zset实现
使用场景:定位、附近的人、距离计算
常用命令:
-
添加地理位置:geoadd key_name longitude(经度) latitude(纬度)place_name (eg:geoadd china:city 116.40 39.90 beijing)
一般是下载城市地理数据,使用java程序一次性导入
-
获取目标底点经纬度数据:geopos key_name place_name1 place_name2(一个或多个)
-
返回两地之间的距离:geodist key_name place1 place2 unit
unit是单位,可以是km m mi ft
-
以给定的经纬度为中心,找出某一半径内的元素:georadius key_name longitude(中心经度) latitude(中心纬度)radius(半径) unit(单位) xxx(附加参数)
附加参数为withdist,结果附加直线距离;withcoord,附加经纬度;count num,限制结果数量
-
查询以指定地点为中心,指定范围内的元素:georadiusbymember key_name place_name radius unit
-
将指定地点的经纬度以字符串的格式返回:geohash china:city place_name
-
移除目标地点:zrem key_name place_name
-
zset相关命令都可以直接使用…
-
-
Hyperloglog
一种用于基数统计的数据结构
基数,即一个数组去除重复元素后,剩余元素的个数;如{1,3,5,5,7}去重后{1,3,5,7},基数为4
使用场景:记录网页的UV(一个人访问多次,按一次算)、计数统计
常用命令:
- 创建一个Hyperloglog:pfadd key_name value1 value2 …
- 查看指定Hyperloglog内元素数量:pfcount key_name
- 合并Hyperloglog(并集):pfmerge key_name key1 key2
-
Bitmap
位图,可以视为一个数组
应用场景:只有两种状态下的统计,0表示一种情况,1表示另一种情况。如:登陆、打卡
常用命令:
- 在目标位图目标下标设值:setbit map_name index 0/1
- 获取目标位图目标下标的值:getbit map_name index
- 统计目标位图中值为1的元素个数:bitcount map_name