day39 redis 数据类型 String 字符串、List 列表、Hash 散列


I know, i know
地球另一端有你陪我




redis 是一种非关系型数据库
默认存在16个数据库,下标从0开始
其中存储的内容是以键值对为元素保存
支持的数据类型包括字符串(strings), 散列(hashes), 列表(lists),
集合(sets), 有序集合(sorted sets)

1、启动 redis 服务

后台启动	
	cd /usr/local/soft/redis/bin
	nohup redis-server redis.conf &

控制台启动
	redis-server
	会导致当前控制台无法使用,需要另开一个控制台

2、关闭redis

	ps -aux | grep redis
	kill -9 xxx(redis-server的代码)

3、连接redis

	 redis-cli

4、切换数据库

	select 0
	select 1

5、清空当前数据库

	flushdb

6、清除所有库中的数据

	flushall

一、String 字符串

	字符串是一种最基本的Redis值类型。Redis字符串是二进制安全的,
	这意味着一个Redis字符串能包含任意类型的数据
	一个字符串类型的值最多能存储512M字节的内容

1、增

1、增加单个键值对(如果重复就覆盖)

	SET key value

2、增加多个键值对(如果重复就覆盖)many

	MSET key value [key value ...]
	
	mest fgh fgh a a b b

3、增加多个键值对(如果重复就创建失败)

	MSETNX key value [key value ...]

2、删

	DEL key [key ...]
	
	del fgh a b

3、改

1、返回旧值并设置新值(如果键不存在,就创建并赋值)

	GETSET key value
	
	getset fgh newfgh

2、追加字符串(如果键不存在,就创建并赋值)

	APPEND key value
	
	append fgh newfgh2

3、覆盖字符串(从指定偏移量 offset,向后覆盖)

	SETRANGE key offset value
	
	setrange fgh 0 newfgh1

4、键重命名(重名就覆盖,加 nx 表示重名就失败)

	RENAME key newkey
	RENAMENX key newkey
	
	renamenx fgh fgh111

4、查

5、查找键(可以使用 *、?等正则表达式 pattern)

	KEYS pattern
	
	keys *		查找所有的
	keys f??	查找f开头,后接两个字符的
	key fg[fgh]  查找fg开头,后接一个f、g、h中任意字符的

6、查看键类型

	TYPE key
	
	type fgh

7、查看键是否存在

	EXISTS key

8、获取键对应的值

	GET key

9、获取多个键对应的值

	MGET key [key ...]
	
	mget fgh a b

10、获取字符串长度

	STRLEN key

11、获取(截取)子字符串
(索引值从0开始,负数表示从字符串右边向左数起,-1表示最后一个字符)

	GETRANGE key start end
	
	getranger fgh 0 -1

5、生存时间 time to live

1、创建键值对时,设置生存时间(ex 代表秒,px 代表毫秒)

	SET key value [EX seconds] [PX milliseconds] [NX|XX]
	
	set fgh fgh ex 20
	set fgh fgh px 20000		20000ms=20s

2、已存在的键值对,设置生存时间

	EXPIRE key seconds
	PEXPIRE key milliseconds
	
	expire fgh 20
	pexpire fgh 20000

3、设置在指定时间戳 Unix 过期

	EXPIREAT key timestamp
	PEXPIREAT key milliseconds-timestamp
	
	EXPIREAT fgh 999999999
	PEXPIREAT fgh 999999999

4、撤销生存时限设置

	PERSIST key

5、查看剩余时间

	key存在但没有设置TTL,返回-1
	key存在,但还在生存期内,返回剩余的秒或者毫秒
	key曾经存在,但已经消亡,返回-2(2.8版本之前返回-1)
	TTL key
	PTTL key

6、值按步长增减

1、按步长增减 1(值需要为 int,否则报错)

	INCR key
	DECR key

2、按步长增减设定值 decrement(值需要为 int,否则报错)

	INCRBY key decrement
	DECRBY key decrement
	
	incrby fgh 50
	decrby fgh 50

位图

	字符串中的字符一个占一个 byte ,即 8 bit
	位图不是真正的数据类型,它是定义在字符串类型中
	一个字符串类型的值最多能存储512M字节的内容
	位上限:2^32 bit

1、设置某一位上的值

	SETBIT key offset value 
	offset偏移量,从0开始
	value不写,默认是0
	
	set fgh 0 1

2、获取某一位上的值

	GETBIT key offset

	getbit fgh 0

3、返回0或者1在区间上第一次出现的位置

	BITPOS key bit [start] [end]
	startendbit

	bittop fgh 0 2

4、统计指定位区间上值为1的个数

	BITCOUNT key [start] [end]
	startend 指 byte 即 8 bit

	bitcount fgh 0 1

1、位操作

1、对一个或多个 key 求逻辑并,并将结果保存到 destkey

	BITOP AND destkey key [key ...]
	
	bittop and newfgh fgh1 fgh2

2、对一个或多个 key 求逻辑或,并将结果保存到 destkey

	BITOP OR destkey key [key ...]

	bittop or newfgh fgh1 fgh2

3、对一个或多个 key 求逻辑异或,并将结果保存到 destkey
(有真为真,同真为假)

	BITOP XOR destkey key [key ...]

	bittop xor newfgh fgh1 fgh2

4、对给定 key 求逻辑非,并将结果保存到 destkey

	BITOP NOT destkey key

	bittop not newfgh fgh

2、应用场景

1、用户活跃天数统计
以 key 值为用户 id
不同的 bit 位对应时间
通过 bitcount 获得总的天数


二、List 列表

	基于压缩列表和链表实现
	元素是字符串类型
	列表头尾增删快,中间增删慢,增删元素是常态
	元素可以重复出现
	最多包含2^32-1元素

1、增

左右或者头尾压入元素

	LPUSH key value [value ...]      
	LPUSHX key value                    如果LIST存在,就压入元素
	RPUSH key value [value ...]
	RPUSHX key value                    如果LIST存在,就压入元素

	lpush fgh 1 2 3 4 5
	rpush fgh 1 2 3 4 5

2、删

1、左右(头尾)弹出元素(死前给你看一眼)

	LPOP key
	RPOP key

2、从一个列表尾部弹出元素压入到另一个列表的头部

	RPOPLPUSH source destination

	rpoplpush fgh aaa
	fgh 右边最后的元素,左压到 aaa

3、从列表头部开始删除值等于value的元素count次

	LREM key count value

count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值
count = 0 : 移除表中所有与 value 相等的值

	lrem fgh 1 a		左起删除一个 a
	lrem fgh -1 a		右起删除一个 a
	lrem fgh 0 a		删除全部的 a

4、去处指定范围外元素

	LTRIM key start stop

	lrtim fgh 0 -1		全删了
	lrtim fgh 1 -1		保留第一个元素

3、改

1、设置指定位置元素的值

	LSET key index value
	
	lset fgh 0 a

2、在列表中某个存在的值(pivot)前或后插入元素

		LINSERT key BEFORE|AFTER pivot value
		key 和 pivot 不存在,不进行任何操作
		选择第一个匹配的元素
	lpush fgh 1 2 3 3 3 3 4 5
	linsert fgh before 3 2.5
	linsert fgh after 3 4.5

4、查

1、返回列表中指定范围元素

	LRANGE key start stop
	LRANGE key 0 -1		表示返回所有元素
	
	lrange fgh 0 3

2、获取指定位置的元素

	LINDEX key index

	lindex fgh 0

3、列表长度(元素个数)

	LLEN key

	llen fgh

5、阻塞 block

如果弹出的列表不存在或者为空,就会阻塞
超时时间设置为0,就是永久阻塞,直到有数据可以弹出
如果多个客户端阻塞在同一个列表上,使用First In First Service原则,先到先服务

1、左右或者头尾阻塞弹出元素

	BLPOP key [key ...] timeout
	BRPOP key [key ...] timeout

	blpop fgh 20		左弹出,阻塞(等待)20

2、从一个列表尾部阻塞弹出元素压入到另一个列表的头部

	BRPOPLPUSH source destination timeout

三、Hash 散列

	key :map
	由field和关联的value组成的map键值对
	field和value是字符串类型
	一个hash中最多包含2^32-1键值对

1、增

1、设置单个字段(key :(key :value))

	HSET key field value
	HSETNX key field value		key的filed不存在的情况下执行,key不存在直接创建
	
	hset fgh id 1001

2、设置多个字段(key :(key :value)、(key :value)…)

	HMSET key field value [field value ...]

	hmset play01 id 1001 name fgh level 30

2、删

删除指定的字段

	HDEL key field [field ...]

3、改

1、在字段对应的值上进行整数的增量计算(必须要 int 类型)

	HINCRBY key field increment

	hincrby play01 level 50

2、在字段对应的值上进行浮点数的增量计算(必须要 int 类型)

	HINCRBYFLOAT key field increment

	hincrbyfloat play01 id 20.5

4、查

1、返回字段个数

	HLEN key

2、判断字段是否存在

	HEXISTS key field	key或者field不存在,返回0

3、返回字段值

	HGET key field

4、返回多个字段值

	HMGET key field [field ...]

5、返回所有的键值对

	HGETALL key

6、返回所有字段名

	HKEYS key

7、返回所有值

	HVALS key

5、应用场景

节约内存空间
每创建一个键,它都会为这个键储存一些附加的管理信息
(比如这个键的类型,这个键最后一次被访问的时间等等)
所以数据库里面的键越多,redis数据库服务器在储存附加管理信息方面耗费的内存就越多,
花在管理数据库键上的CPU也会越多在字段对应的值上进行浮点数的增量计算

微博用户的详细统计

总结

1、nil = null

2、set * & get * 是将 * 作为字符串,而不是全部

3、如果桌面管理显示不正确,可能是此处设置不正确
请添加图片描述

Guess you like

Origin blog.csdn.net/qq_41464008/article/details/121341364