Redis

1.1 NoSQL数据库

NoSQL(Not Only SQL),泛指非关系型数据库。NoSQL不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。

NoSQL特点:不遵循SQL标准,不支持ACID,远超于SQL的性能

NoSQL适用场景:对数据高并发读写,海量数据的读写,对数据高可扩展性的支持

NoSQL不适用场景:需要事务支持,基于sql的结构化查询存储,处理复杂的关系,需要即席查询

官网:https://redis.io/

1.2虚拟机操作

redis安装在了节点1虚拟机上 /usr/local/redis路径下。

客户端 /usr/local/bin/redis-cli

2.常用的五大数据类型

2.1 Redis字符串(String)

String的数据结构为简单动态字符串,是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配
当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次只会多扩1M的空间,字符串最大长度为512M。
 
常用命令  
keys * 查询当前库所有key
set k1 lucy 设置key-value
get k1 取值  
exists k1 判断k1是否存在 1-存在,0-不存在  
type k1 查看键k1是什么类型
del k3 删除k3
unlink k3 根据value选择非阻塞删除,仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作。
expire k1 20  给k1设置过期时间为20秒
ttl k1 查看还有多少秒过期,-1表示永不过期,-2表示已过期
select 1 切换到1库
dbsize 查看当前数据库key的数量
flushdb 清空当前库
flushall 清空所有库内容  
append k1 abc 将abc追加到k1的value的末尾返回最后的长度
strlen k1 获取k1的值的长度
setnx k3 v300 不存在k3和v300时设置值,存在就不起作用
incr k4 k4的数字值加1
decr k4 k4的数字值减1
incrby k4 10 k4的值一次加10
decrby k4 20 k4的值一次减20
mset k1 v1 k2 v2 k3 v3 设置多个值
mget k1 k2 k3 得到多个值  
msetnx k11 v11 k12 v12 当所有key都不重复时才设置成功。原子性,当有一个失败则都失败
 
 set name lucymary
getrange name 0 3 获取指定key的范围里的值
setrange name 3 abc    lucymary就为lucabcry(从3开始覆写占位原来长度的value)
setex age 20 value30 设置age 20秒过期
getset name jack 以新值换旧值  
 

2.2 Redis列表(List)

  单键多值
 Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
 它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
   
常用命令
   lpush k1 v1 v2 v3 v3 从左边依次放入元素,取出顺序为v3 v3 v2 v1
   lrange k1 0 -1 按照索引下标获得元素(从左到右)。0左边第一个,-1右边第一个
   lpop k1/rpop k1 从左边/右边吐出一个值。(取出一个就相当于在原来列表里删除)值在键在,值光键亡
   rpoplpush k1 k2 从k1列表右边吐出一个值,插到k2列表左边。
   lindex k2 0 获取指定索引0处的元素
   llen k2 获得列表长度
   linsert k1 before "v2" "new11" 在k1里元素"v2"的前面插入元素"new11"
   linsert k1 after "v2" "new1" 在k1里元素"v2"的后面插入元素"new1"
   lrem k1 2 v1 删除k1左边开始数的2个元素"v1"
   lset k1 3 wyl 在k1的下标为3的位置把值替换为"wyl"
   
数据结构
   List的数据结构为快速链表quickList
   首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。
   它将所有的元素紧挨着一起存储,分配的是一块连续的内存
   当数据量比较多的时候才会改成quicklist.
   因为普通的链表需要的附加指针空间太大,会比较浪费空间。
 

2.3 Redis集合(Set)

Redis Set对外提供的功能与list类似的是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择
 Redis的Set是String类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)
 
常用命令
 sadd k1 v1 v2 v3 添加多个元素,已存在的元素会被忽略。
 smembers k1 取出该集合的所有值
 sismember k1 v1 k1集合中是否有v1。1有,0没有(Set is member)
 scard k1 返回集合中元素的个数
 srem k1 v1 v2 删除k1集合中的"v1","v2"
 spop k2 随机从该集合中吐出一个值
 srandmember k2 2 随机从该集合取出2个值,不会从集合中删除
 smove k1 k2 v3 把集合k1中的元素"v3"移动到集合k2
 sinter k2 k3 返回集合k2,k3的交集元素
 sunion k2 k3 返回集合k2,k3的并集元素
 sdiff k2 k3 返回集合k2,k3的差集元素(k2中的,不包含k3中的)

数据结构
 Set数据结构是dict字典,字典是用哈希表实现的
 Java中的HashSet的内部实现使用的是HashMap,只不过所有的value都指向同一个对象。
 Redis的Set结构也是一样,它的内部也是使用hash结构,所有的value都指向同一个内部值

2.4 Redis哈希(Hash)

Redis hash是一个键值对集合
Redis hash是一个String类型的field和value的映射表,hash特别适合用于存储对象。
类似Java里的Map<String,Object>

常用命令
 hset user:1001 id 1 name zhangsan   给key(user)集合中键(id/name)赋值(1/zhangsan)
 hget user:1001 name 从key(user)集合中 <field>取出<value>
 hexists user:1001 id 查看哈希表key中,给定域field是否存在
 hkeys user:1001    列出该hash集合的所有field  
 hvals user:1001 列出该hash集合的所有value
 hincrby user:1001 age 2 为哈希表key中的域field的值加上增量 2  -3
hsetnx user:1001 gender 1 将哈希表key中的域field的值设置为value,当且仅当field不存在
   
数据结构
   Hash类型对应的数据结构是两种:ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable

2.5 Redis有序集合Zset(sorted set)

Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合
不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从低分到高分的方式排序集合中的成员。集合的成员是唯一的,但评分可以是重复的。
因为元素是有序的,所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素
访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表
 
常用命令
 zadd topn 200 java 300 C++ 400 mysql 500 php 将一个或者多个member元素及其score值加入到有序集合key中。
 zrange topn 0 -1 返回有序集合key中,下标在<start><stop>之间的元素
 zrange topn 0 -1 withscores   评分也显示
 zrangebyscore topn 300 500   返回有序集合key中,所有score值介于min和max的成员
 zrangebyscore topn 300 500 withscores   评分也显示
 zrevrangebyscore topn 500 200 withscores 同上,改为从大到小排列
 zincrby topn 50 java   为元素的socre加上增量
 zrem topn php 删除该集合下,指定值的元素
 zcount topn 200 300 统计该集合,分数区间内的元素个数
 zrank topn java 返回该值在集合中的排名,从0开始
 
数据结构
 SortedSet(zset)是Redis提供的一个非常特别的数据结构,一方面它等价于Java的数据结构Map<String,Double>,可以给每个元素value赋予一个权重score,另一方面它又类似于TreeSet,内部的元素会按照权重score进行排序,可以得到每个元素的名次,还可以通过score的范围来获取元素的列表。
(1) hash,hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。
(2) 跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表

3.Redis发布与订阅

cd /usr/local/bin  redis-cli 打开Redis客户端
127.0.0.1:6379> SUBSCRIBE channel1  订阅渠道1
127.0.0.1:6379> publish channel1 helloworld  向渠道1发送信息helloworld
 

4.Jedis操作Redis6

cd /etc/redis
[root@localhost redis]# vim 6379.conf  
#bind 127.0.0.1 -::1
protected-mode no
[root@localhost redis]# systemctl restart redis_6379.service
 
[root@localhost redis]# systemctl status firewalld
[root@localhost redis]# systemctl stop firewalld  

 

 

 

posted @ 2021-10-10 21:39  wyl677  阅读(51)  评论(0编辑  收藏  举报