Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis属于NoSql 数据存储数据库。
什么是NoSql?
NoSql=not only Sql
泛指非关系型数据库,web2.0互联网诞生,传统的关系型数据库难以对付Web2.0时代.尤其超大规模的高并发社区.
而关系型数据库:特征为:表格,行列记录.(POI)传统,为传统数据库。如市面上的Mysql、Oracle、PostgreSQL等等
NoSQL的特点:
1.方便扩展(数据之间没有关系)
2.大数据量高性能(Redis 一秒写8万次,读取11万)
Redis是开源的一个内存数据库,数据保存在内存中,但是我们都知道内存的数据变化是很快的,也容易发生丢失。
幸好Redis还为我们提供了持久化的机制,分别是RDB(Redis DataBase)和AOF(Append Only File),这方面在教程二中讲述。
Linu下安装
一.将安装文件包复制到 opt 文件夹下解压
二.安装C++环境包
yum install gcc-c++
三.进入redis文件夹 运行 make 命令 ,然后在运行 make install 命令.
Redis默认安装路径 'usr/local/bin/'
四.将Redis配置文件复制到Redis默认安装路径usr/local/bin/下. 之后就使用这个作为配置文件启动.
五.Redis默认不是后台启动的.需要修改配置文件
daemonize yes
六.启动Redis服务.
七.查看redis服务打开端口状态
ps -ef|grep redis
服务器
打开服务器
redis-server.exe (/.../redis.conf)
访问服务器
redis-cli.exe -h 服务器IP -p 端口号(默认6379)
基础知识
Redis默认有16个数据库
默认使用第0个数据库. 可以使用select进行切换数据库
select (2) # 切换数据库
dbsize # 查看数据库大小
flushdb # 清空当前数据库
flushall # 清空全部数据库
exists (key) #判断是否存在key,返回0,1
exists (key) (数据库名) #移动key到指定数据库中,返回0,1
expire (key) (秒数) #设置key的过期时间,返回0,1 key过期后会自动为null
Redis是单线程(Redis6.0支持多线程).Redis是基于 内存操作,CPU不是Redis的性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽.
Redis将所有的数据放在内存中的,所有说使用单线程性能最高.
数据类型
Redis支持5类数据类型:
**String(字符串)**
**hash(散列)**
**list(列表)**
**set(集合)**
**zset(有序集合)**
1.String
string 是 redis 最基本的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
string 类型的单个值最大能存储 512MB。
set user:1:xx {name=aa,age=32,emil=231432@qq.com}
SET命令
设置指定 key 的值
SET -key- -value-
GET命令
获取指定 key 的值
GET -key-
GETSET命令
将给定 key 的值设为 value ,并返回 key 的旧值
GETSET -key- -value-
KEYS命令
查询当前数据库所有key
KEYS *
STRLEN命令
返回 key 所储存的字符串值的长度
STRLEN -key-
MSET命令
同时设置一个或多个 key-value 对
MSET -key1- -value1- -key2- -value2- ...
2.Hash
hash 哈希 是一个键值(key=>value)对集合,string 类型的 field 和 value 的映射表。
hash 特别适合用于存储对象。
每个 hash 可以存储 232 - 1 键值对(40多亿)。
HMSET命令
为指定key设置hash表
HMSET -key- -field1- -value1- -field2- -value2- ...
HGETALL命令
遍历整个key的hash表内容
HGETALL -key-
HGET命令
获取某个key中指定hash表内容
HGET -key- -field-
HDEL命令
删除整个key中的某个field以及对应value
HDEL -key- -field-
HLEN命令
获取hash表中字段的数量
HLEN -key-
3.List
List列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
LPUSH命令
将一个或多个值插入到列表头部。
LPUSH -key- -value1- -value2- ...
LRANGE命令
根据指定长度获取对应list中值
LRANGE key -start index- -stop index-
LSET命令
通过索引来设置元素的值。
LSET -key- -index- -value-
LLEN命令
获取列表长度。
LLEN -key-
LIINDEX命令
通过索引获取列表中的元素。
LINDEX -key- -index-
LPOP/RPOP命令
删除最后一个元素/删除第一个元素
LPOP -key-
RPOP -key-
RPOPLPUSH命令
删除第一个元素并将其添加到另一个List列表中
RPOPLPUSH -key- -other key-
4.Set
Set 是 string 类型的无序集合。
Set不允许内容重复。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 0或者1
SADD命令
添加一个 string 元素到 key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0。
SADD -key- -value1- -value2- ...
SMEMBER命令
返回集合中的所有的成员。
SMEMBER -key-
SCARD命令
命令返回集合中元素的数量。
SCARD -key-
SISMEMBER命令
判断成员元素是否是集合的成员。返回 0或者1
SISMEMBER -key- -value-
SREM命令
移除set集合中的指定元素
SREM -key- -value-
SRANDMEMBER命令
在指定集合中随机获取指定个数的成员
SRANDMEMBER -key- -size(默认为1)-
对比命令
SDIFF命令
展示出两集合中的差集
SDIFF -key1- -key2-
SINTER命令
展示出两集合中的交集
SINTER -key1- -key2-
SUNION命令
展示出两集合中的并集
SUNION -key1- -key2-
5.Zset
有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个 double 类型的分数。
redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
分数值可以是整数值或双精度浮点数。
ZADD命令
向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZADD -key- -score1- -value1- -score2- -value2- ...
ZSCARD命令
计算集合中元素的数量。
ZSCARD -key-
ZRANGE/ZREVRANGE命令
通过索引区间返回有序集合指定区间内的成员
ZRANGE/ZREVRANGE -key- -minScore- -maxScore- (-withscores-)
三种特殊数据类型
Geospatial - 地理位置
Geospatial 可以推算地理位置信息,两地之间距离 ,方圆几里的人.
GEOSPATIAL的底层原理是ZSET. 所以也可以使用ZSET的命令
Geoadd - 添加地理位置
# 两极无法添加,通常我们使用java程序一次性导入
Geoadd -表名- -东经- -北纬- -列名- [-东经- -北纬- -列名-]...
Geoadd china:city 106.73 31.86 bazhong
Geopos - 查询地理位置
# 获取指定的城市的经纬度
geopos -表名- -列名-
geopos china:city shanghai
Geodist - 计算地理之间距离
单位:
- M 表示 单位为米 (默认)
- KM 表示 单位为千米
- MI表示 单位为英里
- FT 表示 单位为英寸
Geodist -表名- -列名1- -列名2- [单位]
Geodist china:city chengdu bazhong km
Georadius - 寻找附近(通过经纬度)
Georadius -表名- -经度- -纬度- -半径距离- [单位] [withcoord/withdist] [count 数量]
Georadius china:city 110 30 500 km count 3
Georadiusbymember - 寻找附近(通过指定元素)
Georadiusbymember -表名- -列名- -半径距离- [单位]
Georadiusbymember china:city bazhong 1000 km
Hyperloglog数据结构 - 基数统计
Redis Hyperloglog - 基数统计.
*基数:不可重复的元素,可以接受误差.*
网页的UV(一个人访问网站多次,依旧算一个人的数据量)
传统的方式,set保存用户的id,然后就可以统计set中的元素数量作为访问标准,会消耗大量的资源,比较麻烦.
Hyperloglog的优点:
- 占用的内存固定,2^64大小元素,只需要12KB内存存储.
PFADD mykey a b c d e f g h i j k # 创建第一组元素
(integer) 1
PFCOUNT mykey # 统计第一组元素基数数量
(integer) 11
PFADD mykey2 a b c d p q l # 创建第二组元素
(integer) 1
PFCOUNT mykey2 # 统计第二组元素基数数量
(integer) 7
# PFMERGE(合并log) -newkey- -key1- -key2-
PFMERGE mykey3 mykey mykey2 # 合并第一组元素和第二组元素
OK
PFCOUNT mykey3 # 统计第三组元素基数数量
(integer) 15
如果允许容错,那么一定可以使用Hyperloglog. 但如果不允许容错,那使用SET或者自己的数据类型即可 .
Bitmaps - 位图(位存储)
统计用户信息,活跃,不活跃,登录,未登录,打卡,未打卡...两种状态所有Bitmaps!
Bitmaps数据结构,二进制记录,只有0,1 两种状态.
365天的数据状态=365 bit 1字节=8bit 46个字节即可.
# Setbit -表名- -时间- -状态(0\1)-
127.0.0.1:6379> setbit sign 0 1 # 周一 打卡
(integer) 0
127.0.0.1:6379> setbit sign 1 0 # 周二 未打卡
(integer) 0
127.0.0.1:6379> setbit sign 2 1 # 周三 打卡
(integer) 0
127.0.0.1:6379> setbit sign 3 1 # 周四 打卡
(integer) 0
127.0.0.1:6379> setbit sign 4 0 # 周五 未打卡
(integer) 0
127.0.0.1:6379> getbit sign 4 # 查询周五打卡状态
(integer) 0
127.0.0.1:6379> bitcount sign # 查询所有打卡次数(只统计1)
(integer) 3
发布订阅
发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
SUBSCRIBE命令
订阅给定的一个或多个频道的信息。
Subscribe -channel1- -channel2- ....
PUBLISH命令
将信息推送到指定的频道。
Publish -channel- -message-
UNSUBSCRIBE命令
退订指定频道。
Unsubscribe -channel1- -channel2-