3.2字符串类型

  • 实际上redis不只是数据库,更多的公司和团队将redis用作缓存和

    队列系统

3.2.1介绍

字符串类型是redis最基本的数据类型,它能存储任何形式的字符串,

包括二进制数据.你可以用其存储用户的邮箱、JSON化的对象甚至

是一张图片.

  • 一个字符串类型键允许存储的数据的最大容量是512M

  • 字符串类型是其他4中数据类型基础,其他数据类型和字符串类型

    的差别是从某种角度来说只是组织字符串的形式不同.例如,

    • 列表类型是以列表的形式组织字符串
    • 集合类型是以集合的形式组织字符串

3.2.2 命令

  1. 赋值与取值:set key value / get key

    127.0.0.1:6379> set bar '早上好'
    OK
    127.0.0.1:6379> get bar
    "\xe6\x97\xa9\xe4\xb8\x8a\xe5\xa5\xbd"
    127.0.0.1:6379> set foo 'hello'
    OK
    127.0.0.1:6379> get foo
    "hello"
    • $redis-cli --raw启动客户端,显示中文
  2. 递增数字:incr key

    127.0.0.1:6379> incr num
    1
    127.0.0.1:6379> incr num
    2
    • 当操作的键不存在时会默认值为0,所以第一次递增后的结果是1.
    127.0.0.1:6379> set foo lorem
    OK
    127.0.0.1:6379> incr foo
    ERR value is not an integer or out of range
    • 当键值不是整数时,redis会提示错误

3.2.3实践

  1. 文章访问量统计

    为每篇文章使用一个名为post: 文章ID: page.view的键来记录文章

    的访问量,每次访问文章的时候incr命令使相应的键值增加

    • redis对键的命名没有强制的要求,但比较好的实践是用 "对象类型:对象ID:对象属性" 来命名一个键.如"user:1:friends"
  2. 生成自增ID

    关系型数据库中设置字段属性为AUTO_INCREMNT.

    redis中实现的方法:

    对于每一类对象使用名为对象类型(复数形式):count的键来存储当前类型对象的数量,每增加一个新的对象时都使用incr命令增加该键的值.

    由于incr命令建立的键初始值数1,所以很容易得知,incr命令返回值既是加入该对象后的当前类型对象的总数,又是该新增加对象的ID

  3. 存储文章数据

    每个字符串类型键只能存储一个字符串,而一篇博客文章是由标题、正文、

    作者与发布时间等多个元素构成。为了存储这些元素,我们需要使用序列化

    函数将它们转换成字符串。除此之外因为字符串类型键可以存储二进制数据,

    所以也可以使用messagePack进行序列化,速度更快,占用空间也小。

    存储文章伪代码:

    # 首先获得新文章的id
    $postID = incr posts:count
    # 将博客文章的诸多元素序列化成字符串
    $serializedPost = serialize($title,$content,$author,$time)
    # 把序列化后的字符串存入字符串类型的键中
    set post:$postID:data,$serializedPost

    获取文章伪代码(以访问id为42的文章为例):

    # 从redis中读取文章数据
    $serializedPost = get post:42:data
    # 将文章数据反序列化成文章的各个元素
    $title,$content,$author,$time = unserialize($serializedPost)
    # 获取并递增文章的访问数量
    $count = incr post:42:page.view

    还可以对每个元素使用一个字符串类型键来存储

3.2.4命令拾遗

  1. 增加指定的整数:incrby key int(可为负,即为减)

    127.0.0.1:6379> incrby bar 2
    2
    127.0.0.1:6379> incrby bar 3
    5
  2. 减少指定的整数:decrby key int(可为负,即为加)

    127.0.0.1:6379> decrby bar 1
    4
    127.0.0.1:6379> decrby bar 3
    1
  3. 增加指定浮点数:incrbyfloat key 数(可为负,即为减,亦可为整数)

    127.0.0.1:6379> incrbyfloat bar 0.5
    1.5
    127.0.0.1:6379> incrbyfloat bar -0.5
    1
    127.0.0.1:6379> incrbyfloat bar 5e+4
    50001
  4. 向尾部追加值:append key value

    127.0.0.1:6379> set bar hello
    OK
    127.0.0.1:6379> get bar
    hello
    127.0.0.1:6379> append bar world!
    11
    127.0.0.1:6379> get bar
    helloworld!
    127.0.0.1:6379> append bar ' good'
    16
    127.0.0.1:6379> get bar
    helloworld! good
    • 该方法可以创建键
    127.0.0.1:6379> keys *
    bar
    127.0.0.1:6379> append foo book
    4
    127.0.0.1:6379> keys *
    bar
    foo
  5. 获取字符串长度:strlen key

    127.0.0.1:6379> strlen bar
    16
    127.0.0.1:6379> set bar 你好
    OK
    127.0.0.1:6379> strlen bar
    6
  6. 同时获得/设置多个键值:meset k1 v1 k2 v2... / get k1 k2...

    127.0.0.1:6379> keys *
    
    127.0.0.1:6379> mset a 1 b 2 c 3
    OK
    127.0.0.1:6379> keys *
    b
    c
    a
    127.0.0.1:6379> mget c b a
    3
    2
    1
  7. 位操作:

getbit key offset

获得一个字符串类型键指定位置的二进制位的值(0或1),索引从0开始

  • 如果超出了索引,默认值为0

setbit key offset value

设置字符串指定位置的二进制的值,返回值是该位置的旧值

bitcount key [start][end]

获得字符串类型键中值是1的二进制位个数

[start][end]限制统计的字节范围

bitop operation destkey [key...]

对多个字符串类型键进行位运算,并将结果存储在deskey参数指定的键中

bitop支持的运算操作符:and or xor not

bitpos key value [start][end]

获得指定键第一个值是value(0或者1)的位置

  • 如果不设置结束字节且键值所有的二进制位都是1,则查询0的偏移量会是键值长度的下一个字位的偏移量
    127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> getbit foo 0
0
127.0.0.1:6379> getbit foo 1
1
127.0.0.1:6379> getbit foo 2
1
127.0.0.1:6379> getbit foo 3
0
127.0.0.1:6379> getbit foo 6
1
  • bar三个字母对应的ascll码为98\97\114,所以foo键中二进制位结构是

    01100010 01100001 01110010
    127.0.0.1:6379> setbit foo 6 0
1
127.0.0.1:6379> setbit foo 7 1
0
127.0.0.1:6379> get foo
aar
    127.0.0.1:6379> bitcount foo
10
127.0.0.1:6379> bitcount foo 0 1
6
    127.0.0.1:6379> keys *
foo2
foo1
foo
127.0.0.1:6379> bitop or res foo1 foo2
3
127.0.0.1:6379> keys *
foo2
foo1
res
foo
127.0.0.1:6379> get res
car
127.0.0.1:6379> bitop and res foo1 foo2
3
127.0.0.1:6379> get res
`ar
    127.0.0.1:6379> bitpos foo 0
0
127.0.0.1:6379> bitpos foo 1
1
127.0.0.1:6379> bitpos foo 1 1 2
9

Redis自学笔记:3.2入门-字符串类型的更多相关文章

  1. Redis自学笔记:3.5入门-集合类型

    3.5集合类型 3.5.1介绍 在集合中的每个元素都是不同的,且没有顺序 表3-4集合类型和列表类型的对比 - 集合类型 列表类型 存储内容 至多232-1个字符串 至多232-1个字符串 有序性 否 ...

  2. Redis自学笔记:3.4入门-列表类型

    3.4列表类型 3.4.1介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者 获得列表的某一片段. 优点:内部使用的是双向链表,所以向列表两端添加元素的时间复杂度为O(1 ...

  3. Redis自学笔记:3.6入门-有序集合类型

    3.6有序集合类型 3.6.1介绍 在集合类型基础上,为集合中每个元素都关联了一个分数,故可以获得 分数最高(最低)的前N个元素,可以获得指定范围内的元素等 有序集合中每个元素不同,但它们的分数却可以 ...

  4. Redis自学笔记:3.3入门-散列类型

    3.3散列类型 3.3.1介绍 散列类型不能嵌套其他数据类型,一个散列类型可以包含至多232-1个字段 散列类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的数据, 而字段值则存储属性值 ...

  5. Redis自学笔记:3.1入门-热身

    第3章:入门 3.1热身 获取符合规则的键名列表:keys 匹配key 表3-1 glob风格通配符规则 符号 含义 ? 匹配一个字符 * 匹配任意个(包括0个)字符 [ ] 匹配括号间的任一字符,可 ...

  6. JavaScript高级程序设计之自学笔记(一)————Array类型

    以下为自学笔记. 一.Array类型 创建数组的基本方式有两种: 1.1第一种是使用Array构造函数(可省略new操作符). 1.2第二种是使用数组字面量表示法. 二.数组的访问 2.1访问方法 在 ...

  7. Redis自学笔记:1.简介

    博主教材:李子骅.人民邮电出版社.<redis入门指南> 博主操作系统系统:虚拟机Ubuntu16.04 博主redis版本:3.0.6 第1章:简介 redis是一个开源的.高性能的.基 ...

  8. redis 学习笔记二 (简单动态字符串)

    redis的基本数据结构是动态数组 一.c语言动态数组 先看下一般的动态数组结构 struct MyData { int nLen; char data[0]; }; 这是个广泛使用的常见技巧,常用来 ...

  9. jQuery:自学笔记(1)——基础入门

    jQuery:自学笔记(1)——基础入门 认识JQuery 1.jQuery概述 jQuery是一个快速.小巧 .功能丰富的JavaScript函数库.它可以实现“写的少,做的多”的目标. jQuer ...

随机推荐

  1. Eclipse搭建C++\C开发环境

    1.最近使用visualStudio IDE开发Unity 3D使用的编程语言是C#但是发现visualStudio12 版本在自己主机上运行速度比够快,怀疑是不是处理器或者是版本问题,所以该卸载了, ...

  2. Spring Boot的Listener机制的用法和实现原理详解

    之前在介绍了在spring-boot启动过程中调用runner的原理,今天我们介绍另外一种可以实现相似功能的机制:spring-boot的Listener机制. 通过注册Listener,可以实现对于 ...

  3. C++ GetSystemDirectory()

    关于GetSystemDirectory function,参考:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724373(v ...

  4. Axure-----三级下拉菜单的具体实现过程

    ********三级下拉菜单的动画效果:********** 1.选中三级菜单将其转换为动态面板,命名为treePanel,并隐藏. 2.选中二级菜单添加交互效果:[切换可见性],勾选treePane ...

  5. js中匿名函数和回调函数

    匿名函数: 通过这种方式定义的函数:(没有名字的函数) 作用:当它不被赋值给变量单独使用的时候 1.将匿名函数作为参数传递给其他函数 2.定义某个匿名函数来执行某些一次性任务 var f = func ...

  6. 微信小程序 this和that详解及简单实例

    微信小程序中,在wx.request({});方法调用成功或者失败之后,有时候会需要获取页面初始化数据data的情况,这个时候,如果使用,this.data来获取,会出现获取不到的情况,调试页面也会报 ...

  7. ASP.NET Core Cookie-based认证实现

    using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace HelloCore2.Contr ...

  8. Crystal Reports报表使用 [一]

    1.Crystal Reports 是什么? Crystal Reports 是一个功能强大.动态和可操作的报表解决方案,它将帮助你通过网络设计.开发.可视化及发布报表,或嵌入到企业应用之中.有了它, ...

  9. [转]教你十分钟下载并破解IntelliJ IDEA(2017)

    来源:http://www.itwendao.com/article/detail/400687.html 温馨提示:IntelliJ IDEA(2017)需要安装JDK8以上才能运行 如果你是JDK ...

  10. python全栈开发day75-用户注册页面ajax实现,用户头像上传、预览、展示

    一.昨日内容回顾 1. 内容回顾 1. BBS项目登录 1. 登录用form组件和auth模块 1. form组件做校验很方便 2. auth模块 - authenticate(username=xx ...