1、redis jedis客户端 pipeline中可以传入function或consumer,里面可以写多条语句
2、redis客户端setnx: key不存在时才set,存在时则忽略
3、redis数据类型:
hash数据类型:即键值(key=>value)对集合,例子如下:
HMSET runoob field1 "Hello" field2 "World",其中runoob是key,field1和field2是field,Hello和world是value。
一个key可以存储2^32-1个键值对
HGET runoob field1 会返回Hello,HGET runoob field2 会返回World。
list数据类型:value是字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边),列表最多可以存储2^32-1个元素。
lpush runoob mongodb
lpush runoob rabbitmq
lpush runoob kaffff
相当于给key添加了三个元素, lpush从头部插入,rpush从尾部插入数据
lrange runoob 0 10 可以返回该key指定范围里的元素
ltrim(String key, long start, long end) 可以修剪list中元素,只包含指定范围个数的元素
lrange(String key, long start, long end) 返回该key的列表里指定范围内的元素
llen(String key) 返回存储在key里的list的长度。 如果 key 不存在,那么就被看作是空list,并且返回长度为 0
lpop(String key) 移除并且返回key对应的 list 的第一个元素
rpop(String key) 移除并返回存于key的 list 的最后一个元素
set数据类型:Set中元素是惟一的,set中最多可以存储2^32-1个元素
sadd runoob redis
sadd runoob mongodb
sadd runoob kafff
zset(sorted set:有序集合),和set一样,只是每个元素会关联个double类型的分数,redis会按照分数从小到大给元素排序
4、cny2022TigerLoginRecord.lettuce().sync().set(cacheKey, String.valueOf(System.currentTimeMillis()), new SetArgs().nx().ex(DAILY_RECORD_EXPIRE_TIME))
相当于setnx同时设置过期时间
5、incr和incrBy命令:如果key不存在,key的值会先被初始化为0,然后再增加
6、redis客户端对比:jedis, lettuce
jedis
优点:支持全面的 Redis 操作特性(可以理解为API比较全面)
缺点:
1、使用阻塞的 I/O,且其方法调用都是同步的,程序流需要等到 sockets 处理完 I/O 才能执行,不支持异步
2、Jedis 客户端实例不是线程安全的,所以需要通过连接池来使用 Jedis
lettuce:
优点:支持同步异步通信模式。Lettuce 的 API 是线程安全的,如果不是执行阻塞和事务操作,如BLPOP和MULTI/EXEC,多个线程就可以共享一个连接
7、redis mget:批量查询,查询所有给定key的值
redis 127.0.0.1:6379> SET key1 "hello"
OK
redis 127.0.0.1:6379> SET key2 "world"
OK
redis 127.0.0.1:6379> MGET key1 key2 someOtherKey
1) "Hello"
2) "World"
3) (nil)
8、热key:瞬间有几十万的请求去访问redis某个固定的key,从而压垮缓存服务的情况。这样会造成流量过于集中,达到物理网卡上限,从而导致这台redis的服务器宕机。比如XX明星结婚。那么关于XX明星的Key就会瞬间增大,就会出现热数据问题。接下来这个key的请求,就会直接怼到你的数据库上,导致你的服务不可用
9、redis4.0版本后是多线程。之前版本是单线程,单线程指的是网络IO线程和Set/Get操作是由一个线程完成的。但是Redis 的持久化、集群同步还是使用其他线程来完成。4.0之后添加了多线程的支持,主要是体现在大数据的异步删除功能上,例如unlink key(此命令和del类似,用于删除指定的key,区别是此命令将键与键空间断开连接,实际的删除将稍后异步进行)、flushdb async(清空当前db中所有key)、flushall async(清空所有db的key)等。
10、redis单线程:选择单线程原因是使用简单,不存在锁竞争,可以在无锁的情况下完成所有操作,不存在死锁和线程切换带来的性能和时间上的开销,但同时单线程也不能完全发挥出多核 CPU 的性能。
redis为什么快:
1)Redis的大部分操作都在内存中完成,内存中的执行效率本身就很快,并且采用了高效的数据结构,比如哈希表和跳表。
2)使用单线程避免了多线程的竞争,省去了多线程切换带来的时间和性能开销,并且不会出现死锁。
3)采用I/O多路复用机制处理大量客户端的Socket请求,因为这是基于非阻塞的I/O模型,这就让Redis可以高效地进行网络通信,I/O的读写流程也不再阻塞
11、redis和memcache相同不同点:
相同:
数据都是放在内存中,数据会定时刷新到硬盘里,由于读写的是内存,所以速度很快
都有过期策略
不同:
memcache只支持kv形式,redis支持多种数据类型
redis当物理内存用完时,可以将一些很久没用过的kv交换到磁盘
过期策略:memcache在set时就指定,redis可以通过expire方法指定过期时间
memcache挂掉后数据就没了,redis数据可以做持久化,将内存中的数据保持在磁盘中,重启的时候可以再次加载使用
memcache挂掉后数据不可恢复,redis数据丢失后可以通过aof恢复
分布式存储:redis支持数据的备份,即master-slave模式的数据备份。memcache可以使用一致性hash做分布式
数据一致性:redis是单线程,保证数据按顺序提交。memcache使用cas(check and set)保证数据一致性,即对比版本号,如果一致就操作,不一致就放弃任何操作。
使用场景:
如果有数据持久方面的需求或对数据类型和处理有要求的应该选择redis
如果简单的kv存储,可以选memcache
标签:set,runoob,元素,redis,基础知识,memcache,key From: https://www.cnblogs.com/MarkLeeBYR/p/16623521.html