Redis笔记基础篇:6分钟看完Redis的八种数据类型

目录

  • 一、常识补充
  • 二、安装
  • 三、启动redis
  • 四、常用基础命令
  • 五、Redis五大基本数据类型
    • 5.1、String
    • 5.2、Hash
    • 5.3、List
    • 5.4、Set
    • 5.5、Zset
  • 六、三大特殊数据类型
    • 6.1、geospatial
    • 6.2、Hyperloglog
    • 6.3、Bitmap

一、常识补充

redis简介(Remote dictionary Server 远程字典服务器):

Redis是开源免费的,由C语言编写的,一个高性能的(key/value)分布式内存数据库,基于内存运行,并支持持久化的Nosql数据库, 也被称为" 数据结构服务器 "。

提前剧透,redis关于key-value的三大特点:

  1. redis是支持持久化的!我们可以控制数据何时、用何种方式保存到磁盘中,每次重启再次加载该文件,可以完成数据恢复。
  2. redis不单单支持简单的key-value数据类型,同时还可以提供list、set、hash、zset等数据类型的存储
  3. 支持数据的备份。mater-slave模式,即,当下时髦的主从复制读写分离。

应用场景:

  • 内存存储的持久化: 虽然redis是单线程实现的,但是支持异步将数据持久化到硬盘上,同时不影响继续服务。
  • 发布订阅
  • 定时器、计时器: 我们可以把这个特性用到发短信的服务中,每次发送完短信后,就进入倒计时。在指定的时间内拒绝发送第二次,可以有效的缓解短信服务的压力,节流。
  • 取出最新的N个数据的操作: 比如新浪微博的评论系统,他要展示最新的10条评论,就是把最新的10条评论的id放到redis的list里面。

二、安装

去官网下载压缩包:redis.io/download

安装依赖、编译、安装:

1[root@instance-lynj0v9k-19 redis-5.0.9]# yum install gcc-c++
2[root@instance-lynj0v9k-19 redis-5.0.9]# make
3[root@instance-lynj0v9k-19 redis-5.0.9]# make install

我们自己安装的程序默认都在 /usr/local/bin目录下

三、启动redis

将redis的配置文件拷贝到/usr/local/bin目录下,之后使用这个配置文件启动。

修改配置文件,让redis后台启动。

1daemonize no # 修改成 yes

指定配置文件,启动redis。

1redis-server /绝对路径/redis.conf

使用redis-client连接redis。

1redis-cli -h 地址 -p 端口号

退出

 1# 关闭redis-server
 2127.0.0.1:16379> shutdown
 3
 4# 退出redis-cli
 5not connected> exit
 6
 7# 重新尝试连接,因为redis-server被关闭了,所以会被拒绝
 8[root@instance-lynj0v9k-19 bin]# redis-cli -p 16379
 9Could not connect to Redis at 127.0.0.1:16379: Connection refused
10not connected> exit
11
12# 查看redis-server是否还在
13[root@instance-lynj0v9k-19 bin]# netstat -luntp | grep 16379
14[root@instance-lynj0v9k-19 bin]#

四、常用基础命令

 1# redis默认存在16个数据库,默认一开始使用的是第0个
 2[root@instance-lynj0v9k-19 bin]# cat redis.conf | grep  'databases'
 3databases 16
 4
 5# 切换数据库
 6127.0.0.1:16379> select 2
 7OK
 8127.0.0.1:16379[2]>
 9
10# 查看数据库容量
11127.0.0.1:16379[2]> DBSIZE
12(integer) 0
13
14# 查看所有的key
15127.0.0.1:16379[2]> keys *
16(empty list or set)
17
18# 清空当前数据库中的值
19127.0.0.1:16379[2]> flushdb
20OK
21
22# 清空所有库
23127.0.0.1:16379[2]> flushall
24OK

数据库的相关命令 指令
关闭redis shutdown
选择数据库 select 库索引
查看当前数据库中key的数量 Dbsize
清空当前库 Flushdb
通杀所有库 Flushall
key常用命令 指令
查看所有key keys *
判断某个key是否存在 exists key
把key移动到别的库 move key db
为key 设定过期时间 expire key 秒钟
查看还有多少秒过期 ttl key
查看当前key是什么类型的 type key

五、Redis五大基本数据类型

5.1、String

等同于java中的,Map<String,String>

  • string 是redis里面的最基本的数据类型,一个key对应一个value。
  • string 是二进制安全的,意味着:就算我们通过加密算法把图片或者序列化的对象set给redis,它帮我们安全的存储。
  • string的最大内存值 512M

常用命令:

常用命令 命令
添加一对kv set key value
添加多对kv(可覆盖) mset key value key value….
添加多对kv(不可覆盖,只要有一个已存在,全部取消) msetnx key value key value….
获取 get value
获取多对kv mget key key…
删除 del key
在末尾追加 append key value
查询v的长度 strlen key
给数值类型的v加/减1 incr/decr key
给数值类型增加/减少指定大小的值 incrby/decrby key value
获取v的长度 getrange key
在指定位置添加指定值(中间默认用空格补全) setrange key offset value
添加指定生命周期的kv setex key seconds value
如果不存在则添加 setnx key value
获取旧值,设置新值 setget key value

5.2、Hash

等同于java中的:Map<String,Map<String,String>>

  • redis的hash是一个键值对的集合 Map(string, Object)。
  • redis的hash是一个string类型的field和value的映射表,特别适合存储对象。

同样hash相关的指令以 h 开头

作用 命令
添加单个 hset key field value
获取单个 hget key field
一次性添加多个键值 hmset key field1 value1 field2 value2 …
一次性获取多个 hmget
获取所有键值 hgetall key
删除 hdel
获取键值对的个数 hlen
检查是否包含某个字段 hget key field
查看所有key hkeys
给某个数值类型(否则报错)的值增加指定整数值 hincrby key field increment
给某个数字类型值,增加指定浮点类型值 hincrbyfloat key field increment
如果不存在则添加 hsetnx

5.3、list

等同于java中的Map<String,List>

redis的list是一个简单的字符串类型的列表,从功能上看, 它就像是栈和队列结婚后的产物 首先: 它会按照我们插入的顺序排序,然后我们可以从他的头部添加/获取元素,也可以从它的尾部添加/获取元素, (底层实际上是个链表)

list中有比较容易混淆的左右之分,我是把整个list看成一个两边相同的管子,如果是L开头的操作,就想象用左手把这个管子竖起来(我取名字叫左压栈),如果是R开头,就想象是右手把这个管子竖起来,这样就不会混淆取出来的值到底是谁。

list相关的指令,开头全部是 l,表示list

常用命令 命令
左压栈 lpush key v1 v2 v3 v4…
右压栈 rpush key v1 v2 …
查看里面的元素 lrange key start offset
左弹栈 lpop key
右弹栈 rpop key
按照索引查找 lindex key index
查看长度 llen key
删除几个几 lrem key 数量 value
指定开始和结束的位置截取,再赋值给key ltrim key start offset
右出栈左压栈,把resoure的左后一个,压倒dest的第一个 rpoplpush resource destination
重置指定索引的值 lset key index value
在指定元素前/后插入指定元素 linsert key before/after 值1 值2

性能总结:

他是一个字符串链表,left、right都可以插入添加。

  • 如果键不存在,创建新的链表。
  • 如果键已经存在,新增内容。
  • 值全部移除,key消失。
  • 由于是链表,所以它对头和尾操作的效率都极高。但是假如是对中间元素的操作,效率就可怜了。

5.4、Set

等同于java中的Map<String,Set>

第一眼看到set,有没有想起来,它不允许有重复的元素? 没错,它的底层由hashTable实现的,天生去重。

Set的所有指令,全部以 s 开头。

常用命令 命令
添加值 sadd key values
查看值 smembers key
检查集合是否有值 sismember key value
查看set集合里面的元素个数 scard key
删除集合中的指定元素 srem key value
随机弹出某个元素 srandmember key
随机出栈 spop key
把key1中的某个值赋值给key2 smove SourceSet destSet member
数学集合类 命令
差集 sdiff
交集 sinte
并集 sunion

5.5、Zset

(sorted set: 有序集合)sort_set:可排序的set

  • 首先: 它同样具有set的特性,去重!
  • 其次: 每一个元素的value之前会关联上一个double类型的分数。 redis会按照分数的成员,从小到大进行排序.(分数可以重复) 据说:我们平时玩的游戏得分排行榜就是它搞的。

set的值是 k1 v1 k2 v2
zset的值 K1 score v1 k2 score v2

六、三大特殊数据类型

6.1、geospatial

官网地址:redis.io/commands/ge…

可以用来推算两地之间的距离,方圆半径内的人。

关于经度纬度的限制:www.redis.net.cn/order/3685.…

 1# 添加三个城市
 2127.0.0.1:16379[2]> geoadd china:city 116.40  39.99 beijing
 3(integer) 1
 4127.0.0.1:16379[2]> geoadd china:city 117.190 39.1255 tianjin
 5(integer) 1
 6127.0.0.1:16379[2]> geoadd china:city 120.36955 36.094 qingdao
 7(integer) 1
 8127.0.0.1:16379[2]>
 9
10# 获取指定key的经度和纬度
11127.0.0.1:16379[2]> geopos china:city beijing
121) 1) "116.39999896287918091"
13   2) "39.99000043587556519"
14127.0.0.1:16379[2]>
15
16# 获取两个给定位置的距离
17127.0.0.1:16379[2]> geodist china:city beijing qingdao # 默认单位为米
18"555465.2188"
19127.0.0.1:16379[2]> geodist china:city beijing qingdao km
20"555.4652"
21127.0.0.1:16379[2]> geodist china:city beijing qingdao m
22"555465.2188"
23127.0.0.1:16379[2]> geodist china:city beijing qingdao mi # 英里
24"345.1509"
25127.0.0.1:16379[2]> geodist china:city beijing qingdao ft # 英尺
26"1822392.4503"
27
28# 查找附近的人
29# 以给定的经纬度为中心,找出某一半径内的元素
30127.0.0.1:16379[2]> georadius china:city 117.190 39.1255 200 km # 半径为200km
311) "tianjin"
322) "beijing"
33127.0.0.1:16379[2]> georadius china:city 117.190 39.1255 200 km withdist # 指定显示距离
341) 1) "tianjin"
35   2) "0.0001"
362) 1) "beijing"
37   2) "117.6221"
38127.0.0.1:16379[2]> georadius china:city 117.190 39.1255 200 km count 2 # 指定显示2个结果
391) 1) "tianjin"
40   2) "0.0001"
412) 1) "beijing"
42   2) "117.6221"
43
44# 以指定的members为依据,找到它指定范围内的元素
45127.0.0.1:16379[2]> GEORADIUSBYMEMBER china:city beijing 120 km
461) "beijing"
472) "tianjin"
48
49# 返回一个或者多个位置的11位长度的hash串表示
50127.0.0.1:16379[2]> geohash china:city beijing
511) "wx4g2xzyss0"
52127.0.0.1:16379[2]> geohash china:city beijing tianjin
531) "wx4g2xzyss0"
542) "wwgqddx4sc0"
55
56# geo底层使用 zset 实现
57127.0.0.1:16379[2]> ZRANGE china:city 0 -1
581) "qingdao"
592) "tianjin"
603) "beijing"
61
62# 可以通过zrem删除 geo添加的key中的member
63127.0.0.1:16379[2]> ZREM china:city beijing
64(integer) 1
65127.0.0.1:16379[2]> ZRANGE china:city 0 -1
661) "qingdao"
672) "tianjin"

6.2、Hyperloglog

一般我们使用Hyperloglog做基数统计。

什么是基数?就是一个集合中不重复的数的个数。

集合A:{1,3,5,7,9,7}

集合B:{1,3,5,7,9}

AB集合的基数都是5

应用:统计网站的访问量(一个人访问网站很多次仍然算作一次)。

优点:占用的内存是固定的,找2^64次方个数的基数,只需要12KB内存。

缺点:有0.81%的错误率,可以忽略不计

 1# PFCOUNT 计算出来的数量就是Set的基数
 2127.0.0.1:16379[2]> PFADD key4 q w e r q
 3(integer) 1
 4127.0.0.1:16379[2]> PFCOUNT key4
 5(integer) 4
 6
 7# 添加key1和key对应的多个值
 8127.0.0.1:16379[2]> PFADD key1 q w e r
 9(integer) 1
10
11# 统计key下有多少个值
12127.0.0.1:16379[2]> PFCOUNT key1
13(integer) 4
14
15# 添加key2和key对应的多个值
16127.0.0.1:16379[2]> PFADD key2 a s d f
17(integer) 1
18
19# 合并多个key成为一个key
20127.0.0.1:16379[2]> PFMERGE key3 key1 key2
21OK
22127.0.0.1:16379[2]> PFCOUNT key3
23(integer) 8

6.3、Bitmap

比如使用bitmap记录用户从1号到3号到登陆信息

 1# key为sign表示登陆
 2127.0.0.1:16379[2]> SETBIT sign 1 0 # 第一天没有登陆
 3(integer) 0
 4127.0.0.1:16379[2]> SETBIT sign 2 0
 5(integer) 0
 6127.0.0.1:16379[2]> SETBIT sign 3 1 # 第三天登陆了
 7(integer) 0
 8
 9# 获取指定某位的值
10127.0.0.1:16379[2]> GETBIT sign 3
11(integer) 1
12
13# 统计用户这三天登陆了几次,就是统计key下有多少位1
14127.0.0.1:16379[2]> GETBIT sign 3
15(integer) 1
16127.0.0.1:16379[2]> bitcount sign
17(integer) 1
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容