当前位置: 首页 > news >正文

站长工具seo综合查询引流新能源电动车

站长工具seo综合查询引流,新能源电动车,免费制作logo的网站,移动app开发外包公司目录 一、Redis01 1.1 NoSql 1.1.1 NoSql介绍 1.1.2 NoSql起源 1.1.3 NoSql的使用 1.2 常见NoSql数据库介绍 1.3 Redis简介 1.3.1 Redis介绍 1.3.2 Redis数据结构的多样性 1.3.3 Redis应用场景 1.4 Redis安装、配置以及使用 1.4.1 Redis安装的两种方式 1.4.2 Redi…目录 一、Redis01 1.1 NoSql 1.1.1 NoSql介绍 1.1.2 NoSql起源 1.1.3 NoSql的使用 1.2 常见NoSql数据库介绍 1.3 Redis简介 1.3.1 Redis介绍 1.3.2 Redis数据结构的多样性 1.3.3 Redis应用场景 1.4 Redis安装、配置以及使用 1.4.1 Redis安装的两种方式 1.4.2 Redis配置 1.4.3 远程连接Redis 1.5 Redis简单命令 1.6 常见的数据类型 1.6.1 String类型 1.6.2 list类型 1.6.3 hash类型 1.6.4 set类型 1.6.5 zset类型 1.6.6 各数据的使用场景 一、Redis01 1.1 NoSql 1.1.1 NoSql介绍 NoSQL 是 Not Only SQL 的缩写意即不仅仅是 SQL的意思泛指非关系型的数据库。强调 Key-Value Stores 和文档数据库的优点。 NoSQL 产品是传统关系型数据库的功能阉割版本通过减少用不到或很少用的功能来大幅度提高产品性能 不遵循 SQL 标准。 添加 insert 修改 update 不支持 ACID。 远超于 SQL 的性能。 1.1.2 NoSql起源 过去关系型数据库(SQL Server、Oracle、MySQL)是数据持久化的唯一选择但随着发展关系型数据库存在以下问题。 问题 1不能满足高性能查询需求 我们使用:Java、.Net 等语言编写程序是面向对象的。但用数据库都是关系型数据库。存储结构是面向对象的但是数据库却是关系的所以在每次存储或者查询数据时我们都需要做转换。类似 Hibernate、Mybatis 这样的 ORM 框架确实可以简化这个过程但是在对高性能查询需求时这些 ORM 框架就捉襟见肘了。 问题 2应用程序规模的变大 网络应用程序的规模变大需要储存更多的数据、服务更多的用户以及需求更多的计算能力。为了应对这种情形我们需要不停的扩展。 扩展分为两类一种是纵向扩展即购买更好的机器更多的磁盘、更多的内存等等。另一种是横向扩展即购买更多的机器组成集群。在巨大的规模下纵向扩展发挥的作用并不是很大。首先单机器性能提升需要巨额的开销并且有着性能的上限在 Google 和 Facebook 这种规模下永远不可能使用一台机器支撑所有的负载。鉴于这种情况我们需要新的数据库因为关系数据库并不能很好的运行在集群上 1.1.3 NoSql的使用 ①对数据高并发的读写 ②海量数据的读写 ③对数据高可扩展性的 ④秒杀活动 NoSQL 不适用场景 ①需要事务支持 ②基于 sql 的结构化查询存储处理复杂的关系,需要即席查询。 当然用不着 sql 的和用了 sql 也不行的情况考虑用 NoSql 1.2 常见NoSql数据库介绍 1、Memcached 很早出现的 NoSql 数据库 数据都在内存中一般不持久化 支持简单的 key-value 模式支持类型单一 一般是作为缓存数据库辅助持久化的数据库MySQL 2、Redis 几乎覆盖了 Memcached 的绝大部分功能 数据都在内存中支持持久化主要用作备份恢复 除了支持简单的 key-value 模式还支持多种数据结构的存储比如 list、set、hash、zset 等。 一般是作为缓存数据库辅助持久化的数据库 3、MongoDB 高性能、开源、模式自由(schema free)的文档型数据库 数据都在内存中 如果内存不足把不常用的数据保存到硬盘 虽然是 key-value 模式但是对 value尤其是 json提供了丰富的查询功能 支持二进制数据及大型对象 可以根据数据的特点替代 RDBMS成为独立的数据库。或者配合 RDBMS存储特定的数 1.3 Redis简介 1.3.1 Redis介绍 ① Redis 是一个开源的 key-value 存储系统。 ② 和 Memcached 类似它支持存储的 value 类型相对更多包括 string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和 hash哈希类型。 ③ 这些数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作而且这些操作都是原子性的。 ④ 在此基础上Redis 支持各种不同方式的排序。 ⑤ 与 memcached 一样为了保证效率数据都是缓存在内存中。 ⑥ 区别的是 Redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。 ⑦ 并且在此基础上实现了 master-slave(主从)同步。 1.3.2 Redis数据结构的多样性 1.3.3 Redis应用场景 1、数据缓存提高访问性能 查询概率 远大于 增删改的概率 将一些数据在短时间之内不会发生变化而且它们还要被频繁访问为了提高用户的请求速度和降低网站的负载降低数据库的读写次数就把这些数据放到缓存中。 2、会话缓存 session cache主要适用于 session 共享 (string 类型) 3、排行榜/计数器 NGINXluaredis 计数器进行 IP 自动封禁zset 4、消息队列 构建实时消息系统聊天群聊 list 5、统计粉丝数量 对粉丝进行去重set 6、用于存储对象 hash Redis各种数据类型应用场景 ​ string 会话信息 list消息 set粉丝 共同好友 zset :排行榜 hash: 存储对象 1.4 Redis安装、配置以及使用 1.4.1 Redis安装的两种方式 通过压缩包进行安装 1、在官网下载redis压缩包 官网地址Download | Redis 2、通过Fxtp将压缩包传到Linux系统 3、下载安装redis所依赖的环境 yum -y install gcc-c ​ Dependency Updated:glibc.x86_64 0:2.17-326.el7_9     glibc-common.x86_64 0:2.17-326.el7_9   libgcc.x86_64 0:4.8.5-44.el7   libgomp.x86_64 0:4.8.5-44.el7  libstdc.x86_64 0:4.8.5-44.el7   ​ Complete! 出现这样的结果就可以 4、对压缩包进行解压 tar -zxvf redis-5.0.14.tar.gz 5、进入解压后的redis目录进行编译 [rootlocalhost tars]# ls redis-5.0.14 redis-5.0.14.tar.gz [rootlocalhost tars]# cd redis-5.0.14 [rootlocalhost redis-5.0.14]# make ​ Hint: Its a good idea to run make test ;) ​ make[1]: Leaving directory /usr/lwl/tars/redis-5.0.14/src 出现下面这两句就代表着成功 6、安装redis 安装命令make PREFIX/usr/lwl/soft/redis install 如果命令执行不成功换为 make install PREFIX/usr/lwl/soft/redis ​ make[1]: Leaving directory /usr/lwl/tars/redis-5.0.14/src 最后出现这句即为成功 7、启动Redis 进入到安装目录下找到应用中的bin目录输入启动命令 ./redis-server 虽然Redis启动成功但是这种启动方式需要一直打开窗口不能进行其他操作不太方便。 使用ctrlc关闭窗口程序就停止了 可以修改配置文件解决这个问题 除了使用压缩包安装之外还有一种使用yum进行安装的方法 1、先查询系统中自带的redis版本 [rootlocalhost soft]# yum list|grep redis pcp-pmda-redis.x86_64                       4.3.2-13.el7_9             updates 2、使用yum命令进行安装 yum -y install pcp-pmda-redis.x86_64 3、安装位置 /var/lib/pcp/pmdas/redis 1.4.2 Redis配置 将Redis解压目录中的配置文件复制一份放到应用程序的bin目录下 cp /usr/lwl/tars/redis-5.0.14/redis.conf /usr/lwl/soft/redis/bin/redis.conf 1、设置后台启动 在redis.conf 文件将136行的 daemonize no 改成 yes 注可以在底行 使用 /daemonize 快速查询 134 # By default Redis does not run as a daemon. Use yes if you need it.135 # Note that Redis will write a pid file in /var/run/redis.pid when daemonized.136 daemonize yes 设置集群时也有可能再改回no 2、设置密码(需要客户端连接时一定要设置密码) 随便在哪一行添加 requirepass 后面的参数是密码 ​503 # Warning: since Redis is pretty fast an outside user can try up to504 # 150k passwords per second against a good box. This means that you should505 # use a very strong password otherwise it will be very easy to break.506 #507 requirepass 密码 ​ 在设置集群时最好不要设置密码 3、配置远程连接 #注释掉绑定本机才可以远程连接访问66 # IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES67 # JUST COMMENT THE FOLLOWING LINE.68 # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~69 # bind 127.0.0.1 4、后台启动Redis ./redis-server ./redis.conf ./redis-serverRedis的服务 ./redis.conf redis的配置 这里如果不使用redis的配置依然不是后台启动 ​ 启动后使用  ps -ef|grep redis 查询进程 [rootlocalhost bin]# ./redis-server ./redis.conf 11619:C 13 Feb 2023 15:09:31.065 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 11619:C 13 Feb 2023 15:09:31.066 # Redis version5.0.14, bits64, commit00000000, modified0, pid11619, just started 11619:C 13 Feb 2023 15:09:31.066 # Configuration loaded [rootlocalhost bin]# ps -ef|grep redis root      11620      1  0 15:09 ?        00:00:00 ./redis-server *:6379 root      11625   7061  0 15:09 pts/0    00:00:00 grep --colorauto redis 5、连接Redis [rootlocalhost bin]# ./redis-cli     #进行连接 127.0.0.1:6379 ping (error) NOAUTH Authentication required.    #提示输入密码 127.0.0.1:6379 auth 密码    #输入密码 OK 127.0.0.1:6379 ping     #ping测试 PONG 127.0.0.1:6379 quit     #离开Redis 6、连接redis的两种方式 ① 只使用密码进行连接 [rootlocalhost bin]# ./redis-cli -a 密码 Warning: Using a password with -a or -u option on the command line interface may not be safe.    #这里会提示命令中携带密码是不安全的 127.0.0.1:6379 ping PONG 127.0.0.1:6379 ② 完整的命令用于远程连接redis服务 [rootlocalhost bin]# ./redis-cli -h 192.168.111.127 -p 6379 -a 密码 Warning: Using a password with -a or -u option on the command line interface may not be safe.    #提示携带密码不安全 192.168.111.127:6379 ping PONG 192.168.111.127:6379 ​ -h代表主机的ip -p代表主机的端口号 -a代表密码 当redis在本机并且端口号是6379时可以省略不写 7、关闭redis的两种方式 ① 直接使用密码shutdown [rootlocalhost bin]# ./redis-cli -a 密码 shutdown Warning: Using a password with -a or -u option on the command line interface may not be safe. [rootlocalhost bin]# ps -ef|grep redis root      11636   7061  0 15:26 pts/0    00:00:00 grep --colorauto redis ② 使用完整命令shutdown [rootlocalhost bin]# ./redis-cli -h 192.168.111.127 -p 6379 -a 密码 shutdown Warning: Using a password with -a or -u option on the command line interface may not be safe. [rootlocalhost bin]# ps -ef|grep redis root      11647   7061  0 15:28 pts/0    00:00:00 grep --colorauto redis [rootlocalhost bin]# 8、配置服务启动 使用 systemctl 的方法 注服务启动的时候需要配置文件中的 daemonize 值为no也就是不允许后台启动 在/lib/systemd/system 目录下创建一个脚本文件 redis.service里面的内容如下 [Unit] DescriptionRedis Afternetwork.target [Service] ExecStart/usr/lwl/soft/redis/bin/redis-server /usr/lwl/soft/redis/bin/redis.conf ExecStop/usr/lwl/soft/redis/bin/redis-cli -h 127.0.0.1 -p 6379 -a lwl shutdown [Install] WantedBymulti-user.target 配置之前如果没有关闭redis配置完之后建议重启虚拟机 ​ 配置完之后使用的命令 systemctl daemon-reload 刷新配置 systemctl enable redis 开机自启 systemctl status redis   redis 状态 systemctl start redis 开启 redis systemctl stop redis 关闭 redis systemctl disable redis 禁止开机自启 1.4.3 远程连接Redis 本机可视化的远程连接Linux中的Redis使用的软件是RESP 连接过程如下 1.5 Redis简单命令 连接之后可以使用一些简单的命令默认 16 个数据库类似数组下标从 0 开始初始默认使用 0 号库 1、查询数据库一共有多少config get databases127.0.0.1:6379 config get databases 1) databases 2) 16 ​ 在redis.conf文件中第186行可以对初始数据库数量进行设置 2、选中某一个数据库127.0.0.1:6379 select 1 OK 3、设值、取值127.0.0.1:6379[1] set name lwl OK 127.0.0.1:6379[1] get name lwl 4、查询当前库所有key值127.0.0.1:6379[1] keys * 1) name 5、查看当前数据库的 key 的数量127.0.0.1:6379 dbsize (integer) 2 6、清空库flushdb   清空当前库 flushall 清空所有库 7、将当前数据库的key 移动到某个数据库目标库有则不嫩移动将数据库0中的某个key移到数据库1数据库1有name没有age 127.0.0.1:6379 move age 1 (integer) 1 127.0.0.1:6379 move name 1 (integer) 0 8、从当前数据库中随机返回一个key值127.0.0.1:6379 select 1 OK 127.0.0.1:6379[1] randomkey age 127.0.0.1:6379[1] randomkey name 127.0.0.1:6379[1] randomkey age 9、返回key对应的数据类型127.0.0.1:6379[1] type name string 10、删除key127.0.0.1:6379[1] del name (integer) 1 11、判断key值是否存在127.0.0.1:6379[1] exists name (integer) 0 12、给指定的key值设置过期时间127.0.0.1:6379[1] expire name 100    #单位是秒 (integer) 1 127.0.0.1:6379[1] pexpire name 100   #单位是毫秒 (integer) 1 13、删除指定key的过期时间127.0.0.1:6379[1] persist name (integer) 1 14、查看过期时间 -1表示永不过期-2表示已经过期127.0.0.1:6379[1] ttl name (integer) -1     #永不过期 1.6 常见的数据类型 1.6.1 String类型 1、简介 String是Redis最基本的类型你可以理解成与Memcached一模一样的类型一个key对应一个value。 String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。 String类型是Redis最基本的数据类型一个Redis中字符串value最多可以是512M 2、常用命令 1、 set   keyvalue添加键值对 *NX当数据库中key不存在时可以将key-value添加数据库*XX当数据库中key存在时可以将key-value添加数据库与NX参数互斥*EXkey的超时秒数*PXkey的超时毫秒数127.0.0.1:6379[1] set name yyyy NX (nil)              #因为已经存在了name的key所以NX添加不进去 127.0.0.1:6379[1] get name fgfg 127.0.0.1:6379[1] set name kkll XX OK                #虽然已经有了name的key使用XX可以添加进去进行覆盖 127.0.0.1:6379[1] get name kkll 127.0.0.1:6379 set name XX EX 100 #设置key的过期时间 编写时要把XX放在前面 OK ​ 2、 get   key查询对应键值 ​ 127.0.0.1:6379 get name XX ​ 3、 setex key过期时间value# 设置键值的同时设置过期时间单位秒。127.0.0.1:6379 setex test 100 test OK ​ 4、getset keyvalue 以新换旧设置了新值同时获得旧值。 127.0.0.1:6379 getset test lklk test ​ 5、 mset key1 key2 批量设置key 127.0.0.1:6379 mset aaa a1 bbb b1 OK ​ 6、msetnx key1value1key2value2 同时设置一个或多个 key-value 对当且 仅当所有给定 key 都不存在 才会成功有一个失败则都失败。 127.0.0.1:6379 msetnx ccc c1 ddd d1 (integer) 1 127.0.0.1:6379 msetnx aaa a2 fff f1 (integer) 0 ​ ​ 7、mget key1 key2 批量获取 127.0.0.1:6379 mget aaa bbb 1) a1 2) b1 ​ 8、setnx key value 不存在就插入not exists 127.0.0.1:6379 setnx aaa a3 (integer) 0 127.0.0.1:6379 setnx aaaa a4 (integer) 1 ​ 9、setrange key起始位置indexvalue  #从 index 开始替换 value 127.0.0.1:6379 get aaa a1 127.0.0.1:6379 setrange aaa 0 1a (integer) 2 127.0.0.1:6379 get aaa 1a ​ 10、getrange key起始位置结束位置 当结束位置是-1时代表查询所有的字符串因为下标从0开始所以一个字符串的长度是0~n-1 结束位置的值就是n要减去的值 127.0.0.1:6379 get aaa 12345 127.0.0.1:6379 getrange aaa 0 -2 1234 127.0.0.1:6379 getrange aaa 0 -3 123 127.0.0.1:6379 getrange aaa 0 -4 12 ​ 11、incr key 将 key 中储存的数字值增1 只能对数字值操作如果为空新增值为1 127.0.0.1:6379 get age 20 127.0.0.1:6379 incr age (integer) 21 127.0.0.1:6379 incr age (integer) 22 ​ 12、decr key 将 key 中储存的数字值减1 只能对数字值操作如果为空新增值为-1 127.0.0.1:6379 get age 21 127.0.0.1:6379 decr age (integer) 20 127.0.0.1:6379 decr age (integer) 19 ​ 13、incrby key步长将 key 中储存的数字值增加 127.0.0.1:6379 get age 19 127.0.0.1:6379 incrby age 10 (integer) 29 ​ 14、decrby key步长将 key 中储存的数字值减少。 127.0.0.1:6379 get age 29 127.0.0.1:6379 decrby age 5 (integer) 24 ​ 15、append keyvalue #将给定的value 追加到原值的末尾 127.0.0.1:6379 get aaa 12345 127.0.0.1:6379 append aaa 678 (integer) 8 127.0.0.1:6379 get aaa 12345678 ​ 16、strlen key #获得值的长度 127.0.0.1:6379 get aaa 12345678 127.0.0.1:6379 strlen aaa (integer) 8 原子性操作 所谓原子操作是指不会被线程调度机制打断的操作 这种操作一旦开始就一直运行到结束中间不会有任何 context switch 切换到另一个线程。 1在单线程中 能够在单条指令中完成的操作都可以认为是原子操作因为中断只能发生于指令之间。 2在多线程中不能被其它进程线程打断的操作就叫原子操作。 Redis单命令的原子性主要得益于Redis的单线程。 3、数据结构 String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串内部结构实现上类似于Java的ArrayList采用预分配冗余空间的方式来减少内存的频繁分配. 如图中所示内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len。当字符串长度小于1M时扩容都是加倍现有的空间2倍如果超过1M扩容时一次只会多扩1M的空间。需要注意的是字符串最大长度为512M。 1.6.2 list类型 1、简介 Redis 列表是简单的字符串列表按照插入顺序排序。你可以添加一个元素到列表的头部左边或者尾部右边。 它的底层实际是个双向链表对两端的操作性能很高通过索引下标的操作中间的节点性能会较差。 两边都可以进行添加或取出 所以取出的顺序可以是 v3 v2 v1 v4 v5 2、常用命令 1、lpush/rpush keyvalue1value2value3 .... 从左边/右边插入一个或多个值。 127.0.0.1:6379 lpush testlist 1 2 3 (integer) 3 127.0.0.1:6379 rpush testlist 4 5 6 (integer) 6 127.0.0.1:6379 lrange testlist 0 -1 1) 3 2) 2 3) 1 4) 4 5) 5 6) 6 ​ ​ 2、lpop/rpop key 从左边/右边吐出一个值。值在键在值光键亡。 127.0.0.1:6379 lpop testlist 3 127.0.0.1:6379 lrange testlist 0 -1 1) 2 2) 1 3) 4 4) 5 5) 6 127.0.0.1:6379 rpop testlist 6 127.0.0.1:6379 lrange testlist 0 -1 1) 2 2) 1 3) 4 4) 5 ​ ​ 3、rpoplpush key1key2 从key1列表右边吐出一个值插到key2列表左边。 127.0.0.1:6379 lrange tlist 0 -1  #查询tlist所有值 1) v2 2) v1 127.0.0.1:6379 lrange testlist 0 -1  #查询testlist所有值 1) 2 2) 1 3) 4 4) 5 127.0.0.1:6379 rpoplpush testlist tlist  #弹出testlist值放到tlist中 5 127.0.0.1:6379 lrange tlist 0 -1 1) 5 2) v2 3) v1 127.0.0.1:6379 lrange testlist 0 -1 1) 2 2) 1 3) 4 ​ ​ 4、lrange keystartstop 按照索引下标获得元素(从左到右) 127.0.0.1:6379 lrange testlist 0 -1 1) 2 2) 1 3) 4 ​ ​ 5、lindex keyindex按照索引下标获得元素(从左到右) 127.0.0.1:6379 lindex testlist 2 4 ​ 6、llen key获得列表长度 127.0.0.1:6379 llen testlist (integer) 3 ​ ​ 7、linsert key before/after valuenewvalue 在value的后面插入newvalue插入值 127.0.0.1:6379 linsert testlist before 4 3  #会在从左往右第一个符合条件的值前面加 (integer) 4 127.0.0.1:6379 lrange testlist 0 -1 1) 2 2) 1 3) 3 4) 4 ​ 8、lrem keynvalue 从左边删除n个对应的value值(从左到右) 127.0.0.1:6379 lrange testlist 0 -1 1) 2 2) 1 3) 3 4) 3 5) 4 6) 4 127.0.0.1:6379 lrem testlist 3 3 #删除3个值为3的数可是只有两个所以只成功两行 (integer) 2 ​ 9、lsetkeyindexvalue将列表key下标为index的值替换成value 127.0.0.1:6379 lrange testlist 0 -1 1) 2 2) 1 3) 4 4) 4 127.0.0.1:6379 lset testlist 2 6 OK 127.0.0.1:6379 lrange testlist 0 -1 1) 2 2) 1 3) 6 4) 4 3、数据结构 List的数据结构为快速链表quickList。 ① 首先在列表元素较少的情况下会使用一块连续的内存存储这个结构是ziplist也即是压缩列表。 压缩列表是将所有的元素紧挨着一起存储分配的是一块连续的内存。 ② 当数据量比较多的时候才会改成quicklist。Redis将链表和ziplist结合起来组成了quicklist也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速的插入删除性能又不会出现太大的空间冗余。 因为普通的链表需要的附加指针空间太大会比较浪费空间。比如这个列表里存的只是int类型的数据结构上还需要两个额外的指针prev和next。 1.6.3 hash类型 1、简介 hash是一个string类型的field和value的映射表hash特别适合用于存储对象。 类似Java里面的MapString,Object用户ID为查找的key存储的value用户对象包含姓名年龄生日等信息 通过第三种方式 key(用户ID) field(属性标签) 就可以操作对应属性数据了既不需要重复存储数据也不会带来序列化和并发修改控制的问题 2、常用命令 hset keyfieldvalue给key集合中的 field键赋值value 127.0.0.1:6379 hset user name lwl age 30 (integer) 2 ​ hget key1field     从key1集合field取出 value 127.0.0.1:6379 hget user name lwl ​ hmset key1field1value1field2value2... 批量设置hash的值 127.0.0.1:6379 hmset people name lwl age 35 OK ​ hexistskey1field查看哈希表 key 中给定域 field 是否存在。 127.0.0.1:6379 hexists user name (integer) 1 127.0.0.1:6379 hexists user money (integer) 0 ​ ​ hkeys key列出该hash集合的所有field hvals key列出该hash集合的所有value 127.0.0.1:6379 hkeys user 1) name 2) age 127.0.0.1:6379 hvals user 1) lwl 2) 30 ​ hincrby keyfieldincrement为哈希表 key 中的域 field 的值加上增量 127.0.0.1:6379 hincrby user age 2 (integer) 32 127.0.0.1:6379 hincrby user age -2 (integer) 30 ​ hsetnx keyfieldvalue将哈希表 key 中的域 field 的值设置为 value 当且仅当域 field 不存在 127.0.0.1:6379 hsetnx user name test (integer) 0 127.0.0.1:6379 hsetnx user test test (integer) 1 3、数据结构 Hash类型对应的数据结构是两种ziplist压缩列表hashtable哈希表。当field-value长度较短且个数较少时使用ziplist否则使用hashtable。 Hashtable 的实例有两个参数影响其性能初始容量 和加载因子。容量 是哈希表中桶 的数量初始容量 就是哈希表创建时的容量。注意哈希表的状态为 open在发生“哈希冲突”的情况下单个桶会存储多个条目这些条目必须按顺序搜索。加载因子 是对哈希表在其容量自动增加之前可以达到多满的一个尺度。初始容量和加载因子这两个参数只是对该实现的提示。关于何时以及是否调用 rehash 方法的具体细节则依赖于该实现。 ​ 通常默认加载因子(.75)在时间和空间成本上寻求一种折衷。加载因子过高虽然减少了空间开销但同时也增加了查找某个条目的时间在大多数 Hashtable 操作中包括 get 和 put 操作都反映了这一点。 ​ 初始容量主要控制空间消耗与执行 rehash 操作所需要的时间损耗之间的平衡。如果初始容量大于 Hashtable 所包含的最大条目数除以加载因子则永远 不会发生 rehash 操作。但是将初始容量设置太高可能会浪费空间。 ​ 如果很多条目要存储在一个 Hashtable 中那么与根据需要执行自动 rehashing 操作来增大表的容量的做法相比使用足够大的初始容量创建哈希表或许可以更有效地插入条目。 hashtable结构如下图所示 1.6.4 set类型 1、简介 set对外提供的功能与list类似是一个列表的功能特殊之处在于set是可以自动排重的当你需要存储一个列表数据又不希望出现重复数据时set是一个很好的选择并且set提供了判断某个成员是否在一个set集合内的重要接口这个也是list所不能提供的。 2、常用命令 sadd keyvalue1value2将一个或多个 member 元素加入到集合 key 中已经存在的 member元素将被忽略 127.0.0.1:6379 sadd testset v1 v2 v3 v3 v3 v2 (integer) 3 ​ smembers key取出该集合的所有值。 127.0.0.1:6379 smembers testset 1) v2 2) v1 3) v3 ​ sismember keyvalue判断集合key是否为含有该value值有1没有0 127.0.0.1:6379 sismember testset v1  #有元素v1 (integer) 1 127.0.0.1:6379 sismember testset v6  #没有元素v6 (integer) 0 ​ scardkey返回该集合的元素个数。 127.0.0.1:6379 scard testset (integer) 3 ​ srem keyvalue1value2 删除集合中的某个元素。 127.0.0.1:6379 srem testset v1 v2  #删除了元素 v1 v2 (integer) 2 ​ spop key[count]随机从该集合中吐出几个值。吐出之后就等于删除 127.0.0.1:6379 spop testset 2  #随机吐出两个值 1) v5 2) v3 ​ srandmember keyn 随机从该集合中取出n个值。不会从集合中删除 127.0.0.1:6379 srandmember testset 2  #取出两个值 1) v6 2) v4 ​ smove sourcedestinationvalue 把集合中一个值从一个集合移动到另一个集合 127.0.0.1:6379 sadd testset2 t1 t2 t3 (integer) 3 127.0.0.1:6379 smove testset testset2 v4 (integer) 1 127.0.0.1:6379 smembers testset2 1) t2 2) t1 3) v4  #移过来的值 4) t3 ​ sinter key1key2 返回两个集合的交集元素。 sunion key1key2 返回两个集合的并集元素。 sdiff key1key2 返回两个集合的差集元素(key1中的不包含key2中的) 127.0.0.1:6379 smembers testset  #查看testset中所有数据 1) v6 2) v4 127.0.0.1:6379 smembers testset2  #查看testset2中所有数据 1) t2 2) t1 3) v4 4) t3 127.0.0.1:6379 sinter testset testset2 #返回两个set的交集 1) v4 127.0.0.1:6379 sunion testset testset2 #返回两个set的并集 1) t1 2) v4 3) v6 4) t3 5) t2 127.0.0.1:6379 sdiff testset testset2 #返回testset中有而testset2中没有的元素 1) v6 3、数据结构 Set数据结构是dict字典字典是用哈希表实现的。 Java中HashSet的内部实现使用的是HashMap只不过所有的value都指向同一个对象。Redis的set结构也是一样它的内部也使用hash结构所有的value都指向同一个内部值。 1.6.5 zset类型 1、简介 Redis有序集合zset与普通集合set非常相似是一个没有重复元素的字符串集合。 不同之处是有序集合的每个成员都关联了一个评分score,这个评分score被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的但是评分可以是重复了 。 因为元素是有序的, 所以你也可以很快的根据评分score或者次序position来获取一个范围的元素。 访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。 2、常用命令 zadd keyscore1value1score2value2将一个或多个 member元素及其score值加入到有序集key当中 127.0.0.1:6379 zadd money 1 100 2 90 (integer) 2 ​ zrange keystartstop [WITHSCORES] 返回有序集 key 中下标在startstop之间的元素 带WITHSCORES可以让分数一起和值返回到结果集。 127.0.0.1:6379 zadd money 1 100 2 90 (integer) 2 127.0.0.1:6379 zadd money 1 90 #这里已经有了value为90的score2再次添加会进行覆盖 (integer) 0 127.0.0.1:6379 zadd money 1 80 (integer) 1 127.0.0.1:6379 zrange money 0 2 withscores 1) 100 2) 1 3) 80 4) 1 5) 90 6) 1 ​ zrangebyscore key min max [withscores]     [limit offset count] 返回有序集 key 中所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。 zrevrangebyscore key max min [withscores] [limit offset count]               同上改为从大到小排列。 127.0.0.1:6379 zrangebyscore money 1 2 withscores #返回score值为1到2的value并根据score进行排序1) 1002) 13) 804) 15) 906) 17) 858) 29) 95 10) 2 ​ ​ zincrby keyincrementvalue 为元素的score加上增量 127.0.0.1:6379 zincrby money 1 100 #如果有这个value和score会执行成功 2 127.0.0.1:6379 zincrby money 1 9  #如果没有这个value或者score会添加一行 1 ​ zrem keyvalue删除该集合下指定值的元素 127.0.0.1:6379 zrem money 100 (integer) 1 ​ zcount keyminmax统计该集合分数区间内的元素个数 127.0.0.1:6379 zcount money 1 3 #在score值为[1,3]的区间共有五条数据 (integer) 5 ​ zrank keyvalue返回该值在集合中的排名从0开始。 127.0.0.1:6379 zrange money 0 100 1) 120 2) 9 3) 85 4) 95 5) 60 6) 1 127.0.0.1:6379 zrank money 9  #value值为9的排在第二个 (integer) 1 127.0.0.1:6379 zrank money 60  #value值为60的排在第五个 (integer) 4 3、数据结构 SortedSet(zset)是Redis提供的一个非常特别的数据结构一方面它等价于Java的数据结构MapString, Double可以给每一个元素value赋予一个权重score另一方面它又类似于TreeSet内部的元素会按照权重score进行排序可以得到每个元素的名次还可以通过score的范围来获取元素的列表。 zset底层使用了两个数据结构 1hashhash的作用就是关联元素value和权重score保障元素value的唯一性可以通过元素value找到相应的score值。 2跳跃表跳跃表的目的在于给元素value排序根据score的范围获取元素列表。 例对比有序链表和跳跃表从链表中查询出51 ①有序链表 从1开始对比依次向后比较一共要对比六次才能够查询成功 ②跳跃表听起来像是二叉树 从第二层开始第一次和1比较时51比较大所以向后比较 第二次和41比较时51比较大但后面是null所以先向下再向后到第一层61 在第一层比较第一次和61比较时51比较小但前面是刚比较完的41所以先向下再向前到原始层51 在原始层比较第一次和51比较时相等所以就找到了51 一共比较了四次 1.6.6 各数据的使用场景 类型简介特性场景String(字符串)二进制安全可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M---Hash(字典)键值对集合,即编程语言中的Map类型适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去)存储、读取、修改用户属性List(列表)链表(双向链表)增删快,提供了操作某一段元素的API1、最新消息排行等功能(比如朋友圈的时间线) 2、消息队列Set(集合)哈希表实现,元素不重复1、添加、删除、查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐Sorted Set(有序集合)将Set中的元素增加一个权重参数score,元素按score有序排列数据插入集合时,已经进行天然排序1、排行榜 2、带权重的消息队列
http://www.w-s-a.com/news/299489/

相关文章:

  • 浙江建设监理协会网站个人网站设计规划书
  • wordpress太卡了贵州seo推广
  • 企业介绍微网站怎么做的手机软件商城免费下载
  • 新手网站设计定价网站开发销售
  • 网站开发公司oa有没有找人做标书的网站
  • 传统门户网站有哪些人武部正规化建设
  • 台州网站制作方案免费无代码开发平台
  • 精通网站建设 pdf微盘学做电商的步骤
  • 想在网上做设计接单有没有网站找一个免费域名的网站
  • 湘潭市网站建设科技有限公司杭州网站建设(推荐乐云践新)
  • 优秀网站评析西双版纳傣族自治州民宿
  • 常用的cms建站系统c2c网站模板
  • wordpress更换图标seo网站建设公司
  • 网站备案 深圳小程序怎么进入公众号
  • 实名认证域名可以做电影网站吗坪山网站设计的公司
  • wdcp怎么上传做好的网站管理咨询公司名称参考
  • 设计师网站pin分销系统小程序开发
  • 高端品牌网站建设兴田德润实惠企业网站建设应该怎么做
  • 做研学的网站优秀软文案例
  • 网站个人简介怎么做建设网站卡盟
  • 影楼做网站安庆建设机械网站
  • 访问网站的原理wix做网站流程
  • 众鱼深圳网站建设设计师网名叫什么好听
  • 中小学生做试卷的网站6网站建设需要注意哪些细节
  • 以个人名义做地方门户网站社保服务个人网站
  • 上海企业做网站设计制作感悟150字
  • asp.netmvc网站开发ps设计网页
  • win2008 挂网站 404官方网站是什么
  • 网站只做内容 不做外链做姓氏图的网站
  • 中国建设银行信用卡黑名单网站wordpress怎么解密密码