一、数据类型

redis的数据结构是key-value的键值对的形式,但是它和传统String-String的键值对形式不一样,它的value不仅仅是string类型,而是有着丰富的数据类型,如:

1)string

2)list

3)sets

4)sorted

5)hashes

6)bitmaps

7)hyperLogLogs

很多人都认为,要使用好redis其实就是学会如何去合理利用它的数据类型,或者说针对不同的业务场景选择什么样的数据类型。下面会详细讲解各种类型

二、redis的keys

redis的key是二进制安全的字符串,你可以使用简单的"foo"字符串作为key,也可以使用JPED file的图片文件字符串序列作为key,甚至于一个空的字符串也是一个有效的key。

关于redis的key有一下几个原则:

1)不应使用过长的key:过长的key会提高查询成本,如果key不得不使用大的字符串值,可以哈希化。

2)不应使用过短的key: 过短的key通常可读性非常差,如:u1000flw 和 user:1000:followers 明显后者的可读性较高。

3)推荐使用一定格式的key:如:object-type:id 模式:user:1000。:和 . 和 - 经常被用在key的表示中,如:comment:1000:reply-to 或者 comment:1000:reply.to

4) key的最大内存为512mb

三、string类型

string类型是最基本的数据类型。二进制安全的,意思是redis的string可以包含任何数据,处理任何字符串(包括空字符串)、jpg图片、序列化的对象等。

一个string可以存放最大512mb的数据

有很多的用途,如:可以用来缓存如html或者页面等数据。

简单的赋值和取值:

> set mykey somevalue
OK
> get mykey
"somevalue"

可以在赋值时设置参数,如:

在空值的时候设置值,否则失败

> set mykey newval nx
(nil)

在非空的时候设置值,否则失败

> set mykey newval xx
OK

可以做自增操作,自减操作类似(decr、decrby)

> set counter 100
OK
> incr counter
(integer) 101
> incr counter
(integer) 102
> incrby counter 50
(integer) 152

可以设置值并返回旧的值

> getset mykey 100
(nil)

可以同时设置多个值,取多个值(返回数组)

> mset a 10 b 20 c 30
OK
> mget a b c
1) "10"
2) "20"
3) "30"

判断是否存在

> set mykey hello
OK
> exists mykey
(integer) 1
> del mykey
(integer) 1
> exists mykey
(integer) 0

判断类型

> set mykey x
OK
> type mykey
string
> del mykey
(integer) 1
> type mykey
none

设置过期时间

> set key some-value
OK
> expire key 5
(integer) 1
> get key (immediately)
"some-value"
> get key (after some time)
(nil)

查看剩余过期时间

> set key 100 ex 10
OK
> ttl key
(integer) 9

四、list

list是一个链表结构的集合,高效的新增操作,但是查询操作效率不高,如果需要高效查询可以使用sorted set。

它是简单的字符串列表,按照插入的顺序,你可以从左边或者右边添加元素。每个列表可以存储2^32-1(40多亿个元素)

list经常用来存储最新的数据,以及发布/订阅模式中使用

添加操作

> rpush mylist A
(integer) 1
> rpush mylist B
(integer) 2
> lpush mylist first
(integer) 3

查询操作(0表示索引0, -1 表示倒数第一个)

> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"

可以一次添加多个值

> rpush mylist 1 2 3 4 5 "foo bar"
(integer) 9
> lrange mylist 0 -1
1) "first"
2) "A"
3) "B"
4) "1"
5) "2"
6) "3"
7) "4"
8) "5"
9) "foo bar"

删除操作

> rpush mylist a b c
(integer) 3
> rpop mylist
"c"
> rpop mylist
"b"
> rpop mylist
"a"

可以截取

> rpush mylist 1 2 3 4 5
(integer) 5
> ltrim mylist 0 2
OK
> lrange mylist 0 -1
1) "1"
2) "2"
3) "3"

支持阻塞(例如:如果没有值阻塞5秒钟以后执行)

> brpop tasks 5
1) "tasks"
2) "do_something"

五、hashes

哈希是一个键值对集合,键值都是string类型,它特别适合用来存储对象。

每个哈希可以存储2^32 - 1键值对(40多亿)

设置和获取

> hmset user:1000 username antirez birthyear 1977 verified 1
OK
> hget user:1000 username
"antirez"
> hget user:1000 birthyear
"1977"
> hgetall user:1000
1) "username"
2) "antirez"
3) "birthyear"
4) "1977"
5) "verified"
6) "1"

自增

> hincrby user:1000 birthyear 10
(integer) 1987
> hincrby user:1000 birthyear 10
(integer) 1997

六、sets

sets是一种无序的字符串集合,不允许重复,可以方便地用于取交集、并集

集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。

设置值查询值

> sadd myset 1 2 3
(integer) 3
> smembers myset
1. 3
2. 1
3. 2

判断是否存在某个值

> sismember myset 3
(integer) 1
> sismember myset 30
(integer) 0

添加多个值

> sadd news:1000:tags 1 2 5 77
(integer) 4

取交集

> sinter set1 set2

取并集

> sunion set1 set2

取并集数量

> sunionstore set1 set2

查询数量

> scard set

七、sorted set(zset)

有序的set,和set不同的地方在于sorted set是可以根据给定的score排序的

zset的成员是唯一的,但分数(score)却可以重复

添加

> zadd hackers 1940 "Alan Kay"
(integer) 1
> zadd hackers 1957 "Sophie Wilson"
(integer) 1
> zadd hackers 1953 "Richard Stallman"
(integer) 1
> zadd hackers 1949 "Anita Borg"
(integer) 1
> zadd hackers 1965 "Yukihiro Matsumoto"
(integer) 1
> zadd hackers 1914 "Hedy Lamarr"
(integer) 1
> zadd hackers 1916 "Claude Shannon"
(integer) 1
> zadd hackers 1969 "Linus Torvalds"
(integer) 1
> zadd hackers 1912 "Alan Turing"
(integer) 1

查询(我们可以看到根据上面提供的score进行排序了)

> zrange hackers 0 -1
1) "Alan Turing"
2) "Hedy Lamarr"
3) "Claude Shannon"
4) "Alan Kay"
5) "Anita Borg"
6) "Richard Stallman"
7) "Sophie Wilson"
8) "Yukihiro Matsumoto"
9) "Linus Torvalds"

反向排序

> zrevrange hackers 0 -1
1) "Linus Torvalds"
2) "Yukihiro Matsumoto"
3) "Sophie Wilson"
4) "Richard Stallman"
5) "Anita Borg"
6) "Alan Kay"
7) "Claude Shannon"
8) "Hedy Lamarr"
9) "Alan Turing"

连同score一起查出来

> zrange hackers 0 -1 withscores
1) "Alan Turing"
2) "1912"
3) "Hedy Lamarr"
4) "1914"
5) "Claude Shannon"
6) "1916"
7) "Alan Kay"
8) "1940"
9) "Anita Borg"
10) "1949"
11) "Richard Stallman"
12) "1953"
13) "Sophie Wilson"
14) "1957"
15) "Yukihiro Matsumoto"
16) "1965"
17) "Linus Torvalds"
18) "1969"

根据score上限查询

> zrangebyscore hackers -inf 1950
1) "Alan Turing"
2) "Hedy Lamarr"
3) "Claude Shannon"
4) "Alan Kay"
5) "Anita Borg"

根据score范围查询

> zremrangebyscore hackers 1940 1960
(integer) 4

获取元素的索引值

> zrank hackers "Anita Borg"
(integer) 4

八、bitmaps

bitmaps其实不属于一个实际的数据类型,它是基于string类型的。主要用于存储boolean类型的数据,也就是说你只能设置值如1或者0;由于string的最大内存空间为512mb,所以bitmaps的最大值为2^32bit最大值。

我们知道8bit = 1byte = 1/2 char 所以我们用bit来存储统计数据所占的空间是非常小的,也就明白为什么从string类型中扩展出一个bitmaps这样的类型。

添加

> setbit key 10 1
(integer) 1
> getbit key 10
(integer) 1
> getbit key 11
(integer) 0

统计

> setbit key 0 1
(integer) 0
> setbit key 100 1
(integer) 0
> bitcount key
(integer) 2

九、hyperloglogs

redis在2.8.9版本中添加了hyperloglog结构,该结构主要用于基数(不重复元素)统计。它不同于list存储元素本身,而是根据输入元素来计算基数。

HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的(每个 HyperLogLog 键只需要花费 12 KB 内存就可以计算接近 2^64 个不同元素的基数)

但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

那什么是基数呢?

比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。

添加

> pfadd word a b c d d
(integer) 1

统计

> pfcount word
(integer) 4

更多操作命令可以参考官方文档:https://redis.io/commands

redis(2)数据类型的更多相关文章

  1. Redis常用数据类型介绍、使用场景及其操作命令

    Redis常用数据类型介绍.使用场景及其操作命令 本文章同时也在cpper.info发布. Redis目前支持5种数据类型,分别是: 1.String(字符串) 2.List(列表) 3.Hash(字 ...

  2. Redis笔记(三)Redis的数据类型

    前面说过,Redis的一大特性是支持丰富的数据类型, 这为更多的应用场景提供了可能. Redis有五种数据类型,包括string,list,set,sorted set和hash,注意,Redis的数 ...

  3. Redis常用数据类型

    Redis常用数据类型 转载自:http://blog.sina.com.cn/s/blog_7f37ddde0101021q.html     Redis最为常用的数据类型主要有以下五种: ●Str ...

  4. Redis基本数据类型

    -------------------Redis基本数据类型------------------- 1.String 字符串     1.概念         1.String 是redis最基本的类 ...

  5. Redis常用数据类型和事物以及并发

    Redis数据类型 基本类型(String int): 如 set key value .get key 等 所有命令都是按照 key value keys * 可以将全部数据列出,其中后面的 &qu ...

  6. Redis五大数据类型的常用操作

    在上一篇博文<centos安装redis>中,已经详细介绍了如何在centos上安装redis,今天主要介绍下Redis五大数据类型及其五大数据类型的相关操作. Redis支持五种数据类型 ...

  7. redis的数据类型及使用

    Redis 数据类型 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String(字符串) st ...

  8. Redis系列(二):Redis的数据类型及命令操作

    原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...

  9. 一、Redis的数据类型

    一Redis的数据类型 string:字符串 hash:哈希 list:列表 set:集合 zset:有序集合(sorted set) 1.string(字符串) redis最基本的类型.可以理解成与 ...

  10. Redis的数据类型及其常用命令

    快速入门Redis 首先安装redis: windows下安装redis Linux下安装redis 1. 什么是redis Redis属于nosql(非关系型数据库) 关系型数据库是基于关系表的数据 ...

随机推荐

  1. 极大似然估计MLE 极大后验概率估计MAP

    https://www.cnblogs.com/sylvanas2012/p/5058065.html 写的贼好 http://www.cnblogs.com/washa/p/3222109.html ...

  2. 深入了解java虚拟机(JVM) 第五章 如何判断对象为垃圾对象

    本章开始学习垃圾回收的过程,垃圾回收的过程首先就是要确定对象是否是垃圾对象,如果是垃圾对象,垃圾回收器才会进行回收.垃圾回收主要又两种算法:引用计数算法和可达性分析算法. 一.引用计数算法 引用计数算 ...

  3. LVM 认知与扩容操作

    继上次 "Linux系统如何迁移至LVM磁盘"反响不错,近三百的访问量吧.这次想续写点东西,主要讲的是"LVM认知和扩容操作".因为网上大多数不准确,可能作者也 ...

  4. L01-RHEL6.5中部署NTP(ntp server + client)

    RHEL6.5集群中部署NTP NTP全称为Network Time Protocol,即网络时间协议.一般在Linux系统中用来同步集群中不同机器的时间. 本文描述的ntp服务部署框架如下图示 如上 ...

  5. 三种简单的html网页自动跳转方法

    三种简单的html网页自动跳转方法,可以让你在打开一个html网页时自动跳转到其它的页面. 方法/步骤   <html> <head> <title>正在跳转< ...

  6. centos的用户的基本操作

    :一:查看当前系统中的用户账号 grep bash /etc/passwd 二:利用root用户(超级管理员给普通用户修改密码)--------  root用户可以修改其他所有人的密码,且不需要验证 ...

  7. [软件工程]项目选择与NABCD模型分析

    项目 内容 这个作业属于哪个课程 2019春季计算机学院软件工程(罗杰) 这个作业的要求在哪里 团队项目选择 这课程的目标是 以实践形式熟悉软件开发流程,团队开发,合作学习 本次作业对课程的帮助是 确 ...

  8. 二分--POJ-3258

    POJ-3258,二分 题目 Description Every year the cows hold an event featuring a peculiar version of hopscot ...

  9. turtle库笔记

    turtle库是学习python的一个重要数据库,在当下是一个很有趣流行的绘制图像的数据库,她把画笔想象为一只小乌龟在爬行,让小乌龟在一个以横轴为x,纵轴为y的画布上行驶,并且会有多样的行驶角度,速度 ...

  10. 1-----Docker实例-安装Nginx

    Docker 安装 Nginx 方法一.docker pull nginx(推荐) 查找 Docker Hub 上的 nginx 镜像 runoob@runoob:~/nginx$ docker se ...