【Redis学习之五】Redis数据类型:列表和散列
环境
  虚拟机:VMware 10 
  Linux版本:CentOS-6.5-x86_64 
  客户端:Xshell4
  FTP:Xftp4
  jdk8
  redis-2.8.18
一、列表
  基于Linked List实现
  元素是字符串类型
  列表头尾增删快,中间增删慢,增删元素是常态
  元素可以重复出现
  最多包含2^32-1元素
列表的索引
从左至右,从0开始
从右至左,从-1开始


队列:L/R  R/L 从两头操作就是队列
栈: L/L   R/R  一直从一个方向操作就是栈
数组:LINDEX LSET
阻塞:BL BR
命令说明
B block 块,阻塞
L left 左
R right 右
X exist 存在
(1)队列赋值
左右或者头尾压入元素
LPUSH key value [value ...]
LPUSHX key value
RPUSH key value [value ...]
RPUSHX key value
(2)队列取值
左右或者头尾弹出元素
LPOP key
RPOP  key
从一个列表尾部弹出元素压入到另一个列表的头部 
RPOPLPUSH source destination
返回列表中指定范围元素
LRANGE key start stop
LRANGE key 0 -1 表示返回所有元素
PCS103:6379> lrange list 0 -1
fdsf
121
dsj
(3)数组操作
获取指定位置的元素
LINDEX key index
设置指定位置元素的值
LSET key index value
列表长度
LLEN key
(4)从列表头部开始删除值等于value的元素count次,LIST 可以重复出现
LREM key count value
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值
count = 0 : 移除表中所有与 value 相等的值
(5)去除指定范围 外 元素
LTRIM key start stop
举例
RPUSH listkey c abc c ab 123 ab bj ab redis list
LTRIM listkey 0 -1
LTRIM listkey 1 -1
LTRIM listkey 1 10000
微博的评论最后500条
LTRIM u1234:forumid:comments 0 499
(6)插入值
在列表中某个存在的值(pivot)前或后插入元素
LINSERT key BEFORE|AFTER pivot value
key和pivot不存在,不进行任何操作
举例
RPUSH lst Clojure C Lua
LINSERT lst AFTER  C Python
LINSERT lst BEFORE C Ruby
(7)阻塞
如果弹出的列表不存在或者为空,就会阻塞
超时时间设置为0,就是永久阻塞,直到有数据可以弹出
如果多个客户端阻塞在同一个列表上,使用First In First Service原则,先到先服务
左右或者头尾阻塞弹出元素
BLPOP key [key ...] timeout
BRPOP key [key ...] timeout
从一个列表尾部阻塞弹出元素压入到另一个列表的头部
BRPOPLPUSH source destination timeout
二、散列(Hash)
由field和关联的value组成的map键值对
field和value是字符串类型
一个hash中最多包含2^32-1键值对

(1)赋值
设置单个字段
HSET key field value
HSETNX key field value
key的filed不存在的情况下执行,key不存在直接创建
设置多个字段
HMSET key field value [field value ...]
(2)取值
返回字段值
HGET key field
返回多个字段值
HMGET key field [field ...]
返回所有的键值对
HGETALL key
返回所有字段名
HKEYS key
返回所有值
HVALS key
返回字段个数
HLEN key
判断字段是否存在
HEXISTS key field
key或者field不存在,返回0
(3)计算
在字段对应的值上进行整数的增量计算
HINCRBY key field increment
在字段对应的值上进行浮点数的增量计算
HINCRBYFLOAT key field increment
(4)删除
删除指定的字段
HDEL key field [field ...]
举例
HINCRBY numbers x 100
HINCRBY numbers x -50
HINCRBYFLOAT numbers x 3.14
HDEL numbers x
用途
节约内存空间
每创建一个键,它都会为这个键储存一些附加的管理信息(比如这个键的类型,这个键最后一次被访问的时间等等)
所以数据库里面的键越多,redis数据库服务器在储存附加管理信息方面耗费的内存就越多,花在管理数据库键上的CPU也会越多在字段对应的值上进行浮点数的增量计算
 
不适合hash的情况
使用二进制位操作命令:因为Redis目前支持对字符串键进行SETBIT、GETBIT、BITOP等操作,如果你想使用这些操作,那么只能使用字符串键,虽然散列也能保存二进制数据
使用过期键功能:Redis的键过期功能目前只能对键进行过期操作,而不能对散列的字段进行过期操作,因此如果你要对键值对数据使用过期功能的话,那么只能把键值对储存在字符串里面
案例
微博的好友关注
用户ID为key,Field为好友ID,Value为关注时间
user:1000          user:606    20150808
xz   pl  2011  zs 1949  
用户维度统计
统计数包括:关注数、粉丝数、喜欢商品数、发帖数
用户为Key,不同维度为Field,Value为统计数
比如关注了5人
HSET user:100000 follow 5
HINCRBY user:100000 follow 1
【Redis学习之五】Redis数据类型:列表和散列的更多相关文章
- redis 学习(5)-- 列表类型
		
redis 学习(5)-- 列表类型 列表特点 有序.可以重复.左右两边插入弹出 索引相关知识 索引从左往右,从0开始逐个增大 0 1 2 3 4 5 索引从右往左,从-1开始逐个减小 -6 -5 - ...
 - Redis学习笔记1-Redis数据类型
		
Redis数据类型 Redis支持5种数据类型,它们描述如下: Strings - 字符串 字符串是 Redis 最基本的数据类型.Redis 字符串是二进制安全的,也就是说,一个 Redis 字符串 ...
 - Redis学习手册(Set数据类型)
		
一.概述: 在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加.删除或判断某一元素是否存在等操作.需要说明的是,这些操作的时间复杂度 ...
 - Redis学习之二 数据类型和相关命令
		
原文:https://www.cnblogs.com/lonelyxmas/p/9073928.html 如果还不懂安装的,请看 Windows环境下安装Redis Redis一共支持五种数据类型 1 ...
 - Redis 学习-安装、数据类型与 API 理解、Java 客户端
		
本博客是在学习<Redis从入门到高可用,分布式实践>教程时的笔记. 同时参考: https://www.cnblogs.com/jiang910/p/10020048.html 一.Re ...
 - Redis学习之ziplist压缩列表源码分析
		
一.压缩列表ziplist在redis中的应用 1.做列表键 当一个列表键只包含少量列表项,并且每个列表项要么是小整数,要么是短字符串,那么redis会使用压缩列表作为列表键的底层实现 2.哈希键 当 ...
 - StackExchange.Redis帮助类解决方案RedisRepository封装(散列Hash类型数据操作)
		
本文版权归博客园和作者本人共同所有,转载和爬虫请注明本系列分享地址:http://www.cnblogs.com/tdws/p/5815735.html 上一篇文章的不合理之处,已经有所修改. 今天分 ...
 - Redis从基础命令到实战之散列类型(Hash)
		
从上一篇的实例中可以看出,用字符串类型存储对象有一些不足,在存储/读取时需要进行序列化/反序列化,即时只想修改一项内容,如价格,也必须修改整个键值.不仅增大开发的复杂度,也增加了不必要的性能开销. 一 ...
 - Redis学习笔记~Redis主从服务器,读写分离
		
回到目录 Redis这个Nosql的存储系统一般会被部署到linux系统中,我们可以把它当成是一个数据服务器,对于并发理大时,我们会使用多台服务器充当Redis服务器,这时,各个Redis之间也是分布 ...
 
随机推荐
- Ubuntu14.04 LTS 安装Chrome浏览器(转)
			
add zhj: 亲测过,可以,原来不用FQ就可以下载,有点意外 原文:http://www.jianshu.com/p/8220578d0b15 1.打开终端(ctrl + alt + t),下载6 ...
 - bug:使用UIImageView+AFNetworking 图片不能正常显示的原因
			
今天调的东西涉及到图片加载,我刚看了下项目里以前导入了SDWebImage库,又发现整个就一个地方使用到了SDWebImage异步加载图片的方法,感觉占体积又鸡肋,干脆去掉,用UIImageView+ ...
 - c语言数组应用
			
#include <stdio.h> #define SIZE 5 int main(void) { int sum[3]={0},sum2[SIZE]={0},i,sum1=0; dou ...
 - 小程序图片保存的相册授权失败问题,原接口wx.openSeting()已经废弃了的解决办法
			
项目中使用的是wepy框架开发的小程序,,, 使用场景是,用户点击下载图片的时候,要调起授权button(小程序拉起授权的功能都集成在了button组件,所以这里需要用到button组件里的一个ope ...
 - PinyinUtil
			
import java.util.HashSet;import java.util.Set;import java.util.regex.Matcher;import java.util.regex. ...
 - cxf简单例子
			
cxf 这里介绍在web跟非web中的发布以及调用 准备条件: 1,导入cxf的相关jar包,以maven项目为例 pom的配置文件为 <project xmlns="http://m ...
 - Oracle下SQL学习笔记
			
主机字符串:as sysdba alter user scott account unlock;//解锁scott,不会就谷歌检索 DML语句,增.删.查.改 select语句:熟悉表结构 desc ...
 - [ROS]一些传感器数据读取融合问题的思考
			
思考问题: 1. 如何实现传感器数据的融合,或者说时间同步? 比如里程计读数和雷达数据融合? void SlamGMapping::startLiveSlam() { entropy_publishe ...
 - Scala泛型详解
			
在Scala中你可以使用类型参数来实现类和函数,这样的类和函数可以用于多种类型.比如Array[T] 你可以存放任意指定类型T的数据. 类.特质.函数都可以有类型参数:将类型参数放在名字后面用方括号括 ...
 - poj3126
			
被坑了3个小时,本来以为算法错了,谁知道,竟然是素数筛弄错了 !!! #include <iostream>#include <stdio.h>#include <str ...