Redis教程(一):数据操作与发布订阅

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) 接收消息。


pubsub1.png

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:


pubsub2.png

SUBSCRIBE命令

订阅给定的一个或多个频道的信息。

Subscribe  -channel1- -channel2- ....

PUBLISH命令

将信息推送到指定的频道。

Publish -channel- -message-

UNSUBSCRIBE命令

退订指定频道。

Unsubscribe -channel1- -channel2-
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容