redis的基本数据类型
string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)
string类型
赋值语法:
set key_name value(string的存储赋值)
setnx key_name value ((解决分布式锁方案之一)检查是否key键是否存在,不存在则赋值,存在不赋值,返回 0)
取值语法:
get key_name (取出key_name对应的值)
getrange key start end (用于获取存储在指定 key字符串中的子字符串,字符串的截取范围由start和end决定(包括start和and))
getbit key offset (对于key存储的字符串的值,获取指定偏移量上的位(bit))
getset语法:getset key name value (指定key的值,并返回key的旧值,当key不存在时就返回nil)
strlen key (获取key的长度)
删除语法:
del key_name (删除指定的key,如果存在,返回数值类型)
批量写:mset k1 v1 k2 v2 ...
批量度:mget k1 k2 k3 ...
自增自减:
incr key_name: (incr命令将key中存储的数字值增加1,如果key不存在那么key的值就会初始化为0,然后在执行incr操作)
自增: incrby key_name: (增量值incrby将key中存储的数字加上指定的增量值)
自减:decr key_name 或者 decrby key_name
(注意这些key对应的必须是数字类型的字符串,否则会出错)
字符串拼接:append key_name value
addend 命令用于为指定的key追加至魔纹i,如果不存在就为他赋值
字符串长度:strlen key
string的应用场景
- string通常用于郝村字符串或者json字数串数据
- 因string是二进制安全的,所以完全可以吧一个图片文件的内容作为字符串来存储
- 计数器(常规key-value缓存应用,常规计数:微博数、粉丝
incr等指令本身就具有原子操作特性。所以我们可以完全利用redis的incr。incrby。decr。decrby等的指令来实现原子计数的效果。加入在某种场景下有三个客户端同时读取了mynum的值(值为2),然后对其同时进行了加1的操作,那么mynum的值最后一定是5
不少网站都是利用redis这个特性来实=实现业务统计的计数需
hash类型
简介
hash类型是string类型的field和value的映射表,或者说是string集合,hash特别适用于存储对象,相比较而言,将一个对象存储在hash类型中要比存储在string类型占用更少的内存空间
Redis中每个hash可以存储2的32次方-1 个键值对(40多亿)
hash常用命令
赋值语法:
hset key field value ;(为指定的key设定FILe/value)
hmset key fild value:(同时将多个field-value设置到hash中)
取值语法:
hget key filed : (获取函数式中的值,根据Filed得到value)
hmget 可以filed[fied1] :(获取key中所有给定的字段的值)
hgetall key :(返回hash表中所有的字段和值)
hkeys key:获取所有哈希表中的字段
hlen key :获取哈希表中字段的数量
删除语法:
hdel key field[field2] :删除一个或者多个哈希表字段
其他语法:
hsetnx key fedle value :只有在字段filed不存在时,设置hash表的值
hincrby key filed increment:为哈斯表key中指定的证书值上加上增量increment
hincrbyfloat key filed increment :为哈希表key中的我桩顶标高字段浮点数值加上增量increment
hexists key field :查看哈希表中指定的字段是否存在
应用场景
hash应用场景:
- 常用语储存一个对象
- 为什么不用string存储对象?
hash是一种接近关系型数据库的一种数据类型,可以将数据库的一条记录或者程序中一个对象转换成hashmap存放到redis中
总结:redis所提供的的hash很好的解决了对象的存储问题,Rides的hash实际是内部存储的value为一个hashmap,并提供了直接存储map的接口。
list 类型
list是一个链表结构的集合,其主要功能有push、pop、获取元素等,更详细的说,list是一个双端链表的结构,我们可以通过想过的操作进行集合的头部或者尾部的添加和删除元素,list的设计非常的荞麦哦,既可以作为栈、又可以作为队列,满足绝大多数的需求。
常用命令
赋值:
lpush key value [value2] :(将一个或者多个值插入到头部(从左侧添加))
rpush key value [value2] :(在列表中添加一个或者多个值(从右侧添加))
lpushx key value :将一个值插入到已经存在的列表的头部,如果不存在,操作无效
rpushx key value :将一个值插入到已经存在的列表的尾部,如果不存在,操作无效
取值:
llen key: 获取列表的长度
lindex kye index :通过下标获取列表中的元素
lrange key start stop :获取列表指定范围的元素
删除语法:
lpop key :移出并获取列表的第一个元素(左侧元素)
rpop key :移出并获取列表的最后一个元素(右侧元素)
blpop key [key2] timeout :移出并获取列表的第一个元素,如果列表没有元素会阻塞队列直到等待超时或者发现可弹出队列
ltrim key start stop :对一个列表进行裁剪,就是说,让列表只保留指定区间的元素,不在指定区间的将被删除
修改命令:
lset key index value :通过索引设置列表元素的值
linsert key before/after world value :在列表的原色钱或者后插入原色 描述:将值value插入到列表key中,位于world之前或者之后
高级语言:
rpoplpush sorce destinationichu iebiao :移除列表的最后一个元素,并将该元素添加到另一个列表返回
实例:
rpoplpush a1 a2:a1的最后元素移到a2的左侧
HaperLogLog 类型
redis在2.8.9版本添加了HyperLoglog的结构
redis的HyperLoglog是用来做基数统计的算法,HyperLoglog的优点是在输入元素的数量或者体积非常大的时候,计算所需的空间是固定的,并且很小。
在redis中每个HyperLoglog键只需花费12kb的内存,就可以计算接近2的64次方个不同元素的基数
但是因为HyperLoglog只会根据输入的元素来计算基数,而不会存储元素本身,所以HyperLoglog不能像集合那样,返回元素的各个值。
为什么需要HyperLoglog?
如果统计一亿个数据的基数值,就需要很大的内存,但是HyperLoglog很好的解决了这个问题。
常用命令:
pfadd key element [element]:添加指定元素到HyperLoglog中
pfcount key [key] :返回给定HyperLoglog 的基数值
pfmerge destkey sourcekey [sourcekey]:将多个sourcekey合并为一个sourcekey
应用场景
基数不大,数据量不大就用不上,会有点大材小用浪费空间
有局限性,就是只能计算基数数量,而没办法得到具体的内容是什么
统计注册ip数
统计每日访问ip数
统计在线用户数
统计真实文章阅读数
总结
HyperLoglog是一种算法,不是redis独有,redis对于HyperLoglog的存储进行了优化,在基数较小的时候,他的存储空间使用稀疏矩阵存储,空间占用很小。