оригинал:Tickets.WeChat.QQ.com/Yes/ZS Q9VC может WX…
Через две недели печень, наконец, вышла, и карта мозга проблем, связанных с Redis, наконец-то разобралась! ! !В конце статьи нет рутины, которой можно было бы поделиться~~С методом приобретения!
текстКак база данных NoSQL в памяти, Redis с самого начала пользуется большой любовью пользователей благодаря богатым типам данных, простым в использовании командам и высокому уровню параллелизма (официальные данные) до 100 000 на машину. Пять типов данных Redis являются обязательными курсами, когда мы изучаем Redis, но большинство людей просто изучают его команды и API, но они не знают, к каким сценариям можно применять эти типы данных, поэтому эти команды так же легко выучить. Его скоро забудут, ведь он только «на бумаге».
Правильное использование этих пяти типов данных значительно упростит вашу разработку и значительно повысит производительность вашей программы.В то же время эти пять типов данных могут сыграть много трюков.
Однако большинство студентов в реальном процессе разработки использовали только 1-3 из пяти типов данных Redis, а некоторые даже использовали только один тип String. Либо для бизнес-сценариев достаточно просто использовать строку, либо вы просто не знаете или думаете, что другие типы данных более подходят, поэтому даже если какие-то сценарии больше подходят для других типов данных, вы можете об этом не знать. Итак, сегодня поговорим о различных типах данных Redis и о том, для каких сценариев они подходят.
На самом деле, этот вопрос также является «вступительной речью», когда его спрашивают о Redis в интервью. Есть две основные причины задать этот вопрос:
Во-вторых, посмотрите, как вы играли в Redis в реальных проектах и есть ли у вас богатый опыт.
Если вы не отвечаете хорошо, не говорите несколько типов данных и ничего не говорите о сценарии, вы закончили, у интервьюера должно быть плохое впечатление о вас, и он думает, что вы обычно делаете простой набор и получить, не задумываясь.
Без лишних слов, давайте к делу. Всего Redis предоставляет типы данных 5, а именно String, Hash, List, Set, sorted set (Zset) Давайте поговорим об основных общих командах и сценариях использования каждого типа данных.
Нить
Общие команды для структуры String
#字符串常用操作
SET key value //存入字符串键值对
MSET key value [key value ...] //批量存储字符串键值对
SETNX key value //存入一个不存在的字符串键值对
GET key //获取一个字符串键值
MGET key [key ...] //批量获取字符串键值
DEL key [key ...] //删除一个键
EXPIRE key seconds //设置一个键的过期时间(秒)
#原子加减
INCR key //将key中储存的数字值加1
DECR key //将key中储存的数字值减1
INCRBY key increment //将key所储存的值加上increment
DECRBY key decrement //将key所储存的值减去decrement
Вот некоторые часто используемые команды String, давайте посмотрим, к каким сценариям можно применить эти типы команд String.
Сценарии применения
1. Кэш с одним значением
То есть простейший набор и получение значений ключа, таких как кешированные идентификаторы, переключатели и т. д.
SET key value
GET key
2. Кэш объектов
В дополнение к кэшированию одного значения мы также можем использовать тип String для кэширования объектов следующими двумя способами:
#1
SET user:1 value(json串)
GET user:1
#2
MSET user:1:name 编程大道 user:1:sex 1
MGET user:1:name user:1:sex
Первый — напрямую преобразовать объект в строку json и сохранить его как значение в Redis.Этот метод получения объекта относительно прост.Вы можете напрямую получить ключ, чтобы получить значение и преобразовать его в объект, но есть недостатком является то, что если вы хотите изменить одно из полей объектов, мы должны вынуть строку json всего объекта и десериализовать ее в объект, что приведет к ненужным издержкам сети (даже если в памяти существует redis, но в тот факт, что наш сервер приложений и redis изолированы, накладные расходы на передачу по сети не следует недооценивать). Точно так же частая сериализация и десериализация также принесут много накладных расходов на производительность, что станет катастрофой для систем с высокими требованиями к производительности.
Второй метод хранения объектов более дружелюбен к сценарию частого изменения определенного поля объекта.Каждое поле и значение представляет собой пару kv, и модификация напрямую устанавливает kv для его покрытия, но хранит несколько полей.Это не это просто, но, к счастью, есть команда пакетной операции mset, и сетевые накладные расходы меняются с нескольких раз на 1 раз.
3. Распределенная блокировка
Следующая команда setnx является аббревиатурой set if not exit, что означает, что набор выполняется только тогда, когда ключ не существует. Когда несколько потоков выполняют эту команду, только один поток будет успешно выполнен, и это будет рассматриваться как получение блокировки. Затем поток, получивший блокировку, выполняет бизнес-операцию, удаляет блокировку после выполнения и освобождает блокировку.
#setnx key value
SETNX product:10001 true //返回1代表获取锁成功
SETNX product:10001 true //返回0代表获取锁失败
//执行业务操作
DEL product:10001 //执行完业务释放锁
Существует проблема с вышеуказанным методом: неожиданное завершение программы может привести к невозможности снять блокировку, что приведет к тупиковой ситуации. Вы можете использовать следующие команды, чтобы установить как распределенную блокировку, так и время истечения срока действия ключа.
SET product:10001 true ex 10 nx //防止程序意外终止导致死锁
Подробную информацию о реализации распределенных распределенных блокировок Redis см. в фактических распределенных блокировках Redis, которые я написал ранее.
4. Счетчик
INCR article:readcount:{文章id}
GET article:readcount:{文章id}
На основе атомарной команды самоинкремента Redis incr могут быть реализованы такие функции, как счетчики.Все мы знаем, что статьи общедоступных учетных записей, Weibo и блоги имеют концепцию объема чтения.Мы можем использовать этот счетчик для реализации и повышения производительности. очень высок.
Например, количество показаний на рисунке ниже может быть достигнуто за счет автоинкремента redis.
5. Решение для совместного использования сеансов веб-кластера
Первая проблема, которую следует учитывать в случае развертывания системного кластера, — это проблема совместного использования сеанса.Мы можем реализовать функцию распределенного сеанса, передав сеанс, изначально хранящийся в памяти и управляемый tomcat, в Redis для хранения. Фреймворк Spring предоставляет решение для совместного использования сеансов, то есть Spring Session + Redis реализует распределенные сеансы.
6. Глобальный серийный номер распределенной системы
Чтобы обеспечить уникальность глобального порядкового номера в распределенной системе, можно использовать Redis для поддержки автоинкрементной последовательности.
Получите идентификатор автоинкремента от Redis с помощью следующей команды:
#INCR是一个原子自增命令
INCR orderId
В распределенной системной среде Redis используется для обеспечения самоувеличения и уникальности идентификатора.ID, полученный с помощью этой команды, требует взаимодействия с Redis каждый раз.Если бизнес-объем большой, это будет часто.
Поэтому определенное количество идентификаторов можно получить за один раз и сохранить в памяти JVM, а затем получить от Redis, когда они будут израсходованы. Это снижает частые сетевые накладные расходы, но недостатком является то, что некоторые идентификаторы могут быть потеряны (утрачены впустую), потому что сервис может зависнуть после получения, а неиспользованные идентификаторы могут быть потрачены впустую (конечно, вы можете использовать некоторые средства для того, чтобы это не было потрачено впустую, но это не обязательно, это нормально, чтобы тратить немного).
Как следует, получайте 1000 каждый раз
#redis批量生成序列号提升性能
INCRBY orderId 1000
HASH-структура
Общие операции хеширования
HSET key field value//存储一个哈希表key的键值
HSETNX key field value//存储一个不存在的哈希表key的键值
HMSET key field value [field value ...] //在一个哈希表key中存储多个键值对
HGET key field//获取哈希表key对应的field键值
HMGET key field [field ...]//批量获取哈希表key中多个field键值
HDEL key field [field ...]//删除哈希表key中的field键值
HLEN key//返回哈希表key中field的数量
HGETALL key//返回哈希表key中所有的键值
HINCRBY key field increment//为哈希表key中field键的值加上增量increment
Сценарии применения
1. Кэш объектов
В сочетании с характеристиками ключ-поле-значение структуры HASH это похоже на HashMap в Java, а также имеет внутреннюю форму «ключ-значение». Поле может просто хранить имя атрибута объекта. следующие данные,
Мы можем использовать команду HMSET для установки значения поля в пакетах.Идентификатор пользователя вставляется впереди, чтобы гарантировать, что данные, хранящиеся у нескольких пользователей, не будут повторяться;HMGET получает поля пакетами;MSET изменяет поле.
HMSET achievement {userId}:name 小明 {userId}:score 89
HMSET achievement 1:name 小明 1:score 89
HMSET achievement 2:name 小华 2:score 92
HMGET achievement 1:name 1:score
Связь между объектом и HSAH становится следующей фигурой
2. Корзина электронной коммерции
С идентификатором пользователя в качестве ключа, идентификатором продукта в качестве поля и количеством продукта в качестве значения можно реализовать общую операцию корзины покупок.
Работа с корзиной:
#添加商品
hset cart:10001 50005 1
#给某一个商品增加数量
hincrby cart:10001 50005 1
#购物车中商品总个数
hlen cart:10001
#删除商品
hdel cart:10001 50005
#获取购物车所有商品
hgetall cart:10001
Несколько общих операций, соответствующих корзинам покупок, можно представить с помощью Redis.
###Преимущества и недостатки структуры хеша
преимущество
-
Классифицируйте и интегрируйте похожие данные в хранилище (с тем же ключом), чтобы упростить управление данными.
-
По сравнению со строковыми операциями потребление памяти и процессора меньше.
-
Экономит больше места, чем хранилище String
недостаток
-
Функция истечения срока действия не может использоваться для полей, только для ключей.
-
Кластерная архитектура Redis не подходит для крупномасштабного использования.
Структура списка
Список общих операций
Мы можем думать о левой части списка как о голове, а о правой части как о хвосте.
Общие команды
LPUSH key value [value ...] //将一个或多个值value插入到key列表的表头(最左边)
Сценарии применения
1. Внедрите общие структуры данных
На основе функций List и расширенных команд могут быть реализованы часто используемые централизованные структуры данных:
1)Stack(栈) = LPUSH + LPOP ,FILO先入后出
Комбинируя команды LPUSH и LPOP для реализации функции стека «первым пришел — последним вышел», LPUSH вставляется в стек слева, а LPOP извлекается из стека слева. Эквивалент входа и выхода один.
2)Queue(队列)= LPUSH + RPOP,FIFO先进先出
Комбинируя команды LPUSH и RPOP для реализации функции очереди «первым пришел – первым обслужен», LPUSH входит в очередь слева, RPOP выходит из очереди справа и «первым пришел – первым вышел». Равнозначно входу и выходу с обеих сторон.
3)Blocking MQ(阻塞队列)= LPUSH + BRPOP
Комбинируя LPUSH и BRPOP для реализации очереди блокировки, BRPOP имеет на один параметр тайм-аута больше, чем RPOP, который является максимальным временем ожидания.Если в течение этого времени данные не будут получены, он вернется пустым.
2. Новости Weibo и новости публичного аккаунта WeChat
Например, идя сам, я следую за большими V, такими как People's Daily Online, Huawei China и метро Пекин-Гонконг. Предположим, что People's Daily Online публикует Weibo с идентификатором 30033. Если я подпишусь на него, я отправлю этот микроблог в свое сообщение. Идентификатор блога, когда я открываю свой Weibo, я беру первые несколько идентификаторов Weibo из моей эксклюзивной очереди сообщений и показываю их мне, поэтому это включает в себя несколько ключевых моментов:
1)人民网发了一条微博,ID为30033,消息ID入队
LPUSH msg:{walking-ID} 30033
2)华为中国发微博,ID为30055,消息入队
LPUSH msg:{walking-ID} 30055
3)我登录进去,会给我展示最新微博消息,那么就从我的消息队列里取最新的前5条显示在首页
LRANGE msg:{walking-ID} 0 5
НАБОР структуры
Установить общие операции
SADD key member [member ...]//往集合key中存入元素,元素存在则忽略,若key不存在则新建
SREM key member [member ...]//从集合key中删除元素
SMEMBERS key //获取集合key中所有元素
SCARD key//获取集合key的元素个数
SISMEMBER key member//判断member元素是否存在于集合key中
SRANDMEMBER key [count]//从集合key中选出count个元素,元素不从key中删除
SPOP key [count]//从集合key中选出count个元素,元素从key中删除
установка операции
SINTER key [key ...] //交集运算
SINTERSTORE destination key [key ..]//将交集结果存入新集合destination中
SUNION key [key ..] //并集运算
SUNIONSTORE destination key [key ...]//将并集结果存入新集合destination中
SDIFF key [key ...] //差集运算
SDIFFSTORE destination key [key ...]//将差集结果存入新集合destination中
Сценарии применения
1. Лотерейный апплет WeChat
Все должны были использовать лотерейный апплет в WeChat. Как показано на рисунке ниже, мы можем нажать, чтобы немедленно принять участие в лотерее, а также просмотреть всех участников. Наконец, в функции лотереи есть три ключевых момента.
Давайте посмотрим, как эти три ключевых момента реализованы с типом данных set:
1)点击参与抽奖,则将用户ID加入集合
SADD key {userlD}
2)查看参与抽奖所有用户
SMEMBERS key
3)抽取count名中奖者
SRANDMEMBER key [count]//返回但不从set中剔除
Если вы устанавливаете первый приз, второй приз, третий приз... и каждый человек может получить только один приз, вы можете использовать счетчик ключей SPOP.
2. Ставьте лайки, добавляйте в избранное и отмечайте в WeChat и Weibo
Например, ходячий разместил в кругу друзей, и кому-то это понравилось
1) 点赞 点赞就把点赞这个人的ID加到这个点赞的集合中
SADD like:{消息ID} {用户ID}
2) 取消点赞 从集合中移除用户ID
SREM like:{消息ID} {用户ID}
3) 检查用户是否点过赞
SISMEMBER like:{消息ID} {用户ID}
4) 获取点赞的用户列表
SMEMBERS like:{消息ID}
5) 获取点赞用户数
SCARD like:{消息ID}
Сценарии применения операции сбора наборов
Основываясь на богатых командах, предоставляемых коллекцией Redisset, мы можем легко реализовать операции пересечения, объединения и разности в коллекции. Например, в существующих наборах set1, set12, set3 элементы такие:
set1:{a,b,c}
Выполнение операций пересечения, объединения и разности над множествами
SINTER set1 set2 set3 //交集--> { c }
С помощью этих основных операций мы можем увидеть, какие бизнес-требования могут быть достигнуты.
3. Коллективная работа для достижения модели внимания социального программного обеспечения
Модель внимания пользователя социального программного обеспечения, такого как друзья QQ, внимание Weibo, внимание Douyin, внимание Kuaishou, внимание официальной учетной записи WeChat, это социальное программное обеспечение будет иметь такую функцию, то есть рекомендацию модели отношения пользователя, включая людей, представляющих общий интерес , Люди, которых вы, возможно, знаете,
Во-первых, давайте посмотрим на людей, за которыми следуют ходьба, ченмовангер и Холлис, а именно:
1)walking关注的人:
walkingSet-->{chenmowanger, ImportNew, Hollis}
2) chenmowanger关注的人:
chenmowangerSet-->{walking, ImportNew, Hollis, JavaGuide}
3) Hollis关注的人:
HollisSet--> {waking, ImportNew, JavaGuide, feichao, CodeSheep}
(Шучу, большие парни не обратили на меня внимания, ха-ха 😂)
Список наблюдения каждого представляет собой набор Redis, а затем, когда вы переходите на домашнюю страницу chenmowanger, там будет область, посвященная тому, чтобы показать часть моего внимания и внимания второго брата:
4) walking和chenmowanger共同关注:
То есть посмотреть кто в моем наборе и в наборе второго брата
//两个集合求并集
SINTER walkingSet zhangyixingSet--> {ImportNew, Hollis}
5) 我关注的人也关注他(chenmowanger):
Посмотрите, есть ли кто-то в списке наблюдения людей, на которых я подписан, например, если я захожу на домашнюю страницу chenmowanger, он может показать, кто еще из людей, на которых я подписан, также подписан на chenmowanger.
SISMEMBER ImportNewSet chenmowanger
6) 我可能认识的人:
Для набора различий превалирует предыдущий набор Я не обращал внимания на тех людей, на которых обращает внимание второй брат, поэтому я быстро последовал за JavaGuide (Брат гида)
SDIFF chenmowangerSet walkingSet->{walking, JavaGuide}
4. Операция сбора реализует проверку товаров электронной коммерции.
Во-первых, взгляните на эту картинку, чтобы убедиться, что она очень знакома.При покупке мобильного телефона есть функция фильтра.
Как показано на рисунке выше, веб-сайт электронной коммерции покупает мобильный телефон и заходит на эту страницу для поиска мобильного телефона в соответствии с различными условиями.Давайте подумаем, как использовать Redis для достижения этой цели? (Конечно, это не означает, что люди используют Redis для реализации этого набора поисков. На самом деле они в основном используют промежуточное программное обеспечение поисковых систем. Это просто для того, чтобы показать, что их можно реализовать с помощью Redis~)
Поддерживайте продукты, когда продукты размещаются на полках, и добавляйте соответствующие продукты в соответствующую коллекцию наборов при добавлении продуктов, как показано в следующем примере.
//品牌-华为
SADD brand:huawei P30 Mate30 荣耀Play4 nova7
//品牌-小米
SADD brand:xiaomi mi6 mi8 mi9 mi10
//品牌-iPhone
SADD brand:iPhone iphone8 iphone8plus iphoneX iphone11
//操作系统-Android
SADD os:android P30 Mate30 荣耀Play4 nova7 mi6 mi8 mi9 mi10
//CPU品牌-骁龙
SADD cpu:brand:xiaolong iphone8 iphone8plus iphoneX iphone11 mi6 mi8 mi9 mi10
//CPU品牌-麒麟
SADD cpu:brand:qilin P30 Mate30 荣耀Play4 nova7
//运行内存-8G
SADD ram:8G P30 Mate30 荣耀Play4 nova7 mi6 mi8 mi9 mi10 iphone8 iphone8plus iphoneX iphone11
//多条件查询 操作系统Android,CPU品牌骁龙,运行内存8G
SINTER os:android cpu:brand:xiaolong ram:8G -->{mi6 mi8 mi9 mi10}
Скриншоты легче увидеть:
Если предположить, что мы поддерживаем различные бренды, операционную систему, к которой принадлежит мобильный телефон, марку процессора, оперативную память и т. д., то мы можем использовать выбранные наборы, чтобы найти их пересечение, когда мы проверяем условия для поиска.
ZSet отсортированная коллекция
zset — это упорядоченный набор наборов, отсортированный по входящему счету
Общие операции ZSet
ZADD key score member [[score member]…]//往有序集合key中加入带分值元素
ZREM key member [member …] //从有序集合key中删除元素
ZSCORE key member //返回有序集合key中元素member的分值
ZINCRBY key increment member//为有序集合key中元素member的分值加上increment
ZCARD key//返回有序集合key中元素个数
ZRANGE key start stop [WITHSCORES]//正序获取有序集合key从start下标到stop下标的元素
ZREVRANGE key start stop [WITHSCORES]//倒序获取有序集合key从start下标到stop下标的元素
Операции сбора Zset
ZUNIONSTORE destkey numkeys key [key ...] //并集计算
ZINTERSTORE destkey numkeys key [key …]//交集计算
Сценарии применения
1. Установите операцию Zset для достижения рейтинга лидеров
Мы все знаем, что горячие точки Weibo, горячие списки новостей, рейтинги голосования и т. д. имеют концепцию ранжирования, как показано в следующем списке горячих новостей Baidu, который показывает новости в реальном времени с относительно большим количеством кликов (при условии, что идентификаторы этих новостей равны 1001). -1010), каждая новость имеет горячую ценность, как правило, в зависимости от количества кликов, точка доступа 1001 — 484 Вт, 1002 — это 467 Вт, в режиме реального времени, позже может быть иначе, а затем давайте посмотрим, как использовать Redis для достижения.
1)点击新闻
Каждый раз, когда кто-то нажимает на эту новость, ius прибавляет 1 к своей оценке так долго.
ZINCRBY hotNews:20200722 1 1001 //新闻ID为1001的新闻分值加一
2)展示当日排行前十
Возьмите первые 10 элементов в коллекции
ZREVRANGE hotNews:20200722 0 10 WITHSCORES
3)七日热点榜单计算
ZUNIONSTORE hotNews:20200715-20200721 7 hotNews:20200715 hotNews:20200716... hotNews:20200721
4)展示七日排行前十
ZREVRANGE hotNews:20190813-20190819 0 10 WITHSCORES
Больше сценариев применения
-
WeChat
-
Didi Taxi, Mobike
-
Meituan и Ele.me
-
автодополнение поиска
-
Фильтр Блума
Эпилог
В этой статье в основном рассказывается о бизнес-сценариях, которые могут быть реализованы с помощью соответствующих команд в пяти типах данных Redis. Через общие бизнес-сценарии в нашей жизни мы можем помочь понять использование различных типов данных Redis. Комбинирование сценариев также может помочь нам быть более яркими, чтобы понять и изучить различные команды операций с типами данных Redis. В то же время ходьба также надеется, что благодаря руководству этой статьи читатели и друзья смогут вдохновиться сценариями применения типов данных Redis.Когда есть возможность предъявлять требования, подумайте, не лучше ли использовать Redis при проектировании система Давайте бросим кирпич и привлечем Джейд. Опять же, некоторые из сценариев приложений, перечисленных в этой статье, могут быть не самыми подходящими для использования Redis, а некоторые просто иллюстрируютМожетИспользуя Redis для реализации, я надеюсь, вы сможете подумать о том, как спроектировать его в соответствии с вашими реальными бизнес-сценариями. Если у вас есть какие-либо вопросы, пожалуйста, помогите. Наконец, я надеюсь, что объяснение этой статьи может быть полезно для всех.Если это полезно, пожалуйста, немного подбодрите ходьбу, помнитеСтавьте лайк ❤, делайте репост 🤞о~
Не уходи, есть пасхалки ↓ ↓ ↓
Прошло два года с тех пор, как ходьба поддерживала этот публичный аккаунт. Сначала это было для моего собственного резюме. Позже некоторые люди обратили внимание. Я думаю, что стоит помочь большему количеству людей с помощью моих статей и обмена. Спасибо моим друзьям, которые подписались на этот публичный аккаунт ❤~
Хотя результат невелик, я пишу, и я написал много статей, каждая статья публикуется только после нескольких дней или даже недели полировки и тщательного изучения. Но это всегда не было ни чумой, ни огнем, даже если никто не обратит внимания или кому-то это не понравится, я буду упорствовать, потому что здесь мои накопления и след, который я оставил~
У вас есть какие-либо предложения или мнения? Добро пожаловать, чтобы оставить сообщение или личное сообщение~ Ниже приведены точки знаний Redis, которые я собирал в течение двух недель и составил карту разума для всеобщего ознакомления. Он был преобразован в различные форматы, добро пожаловать на оплату вниманиеПубличный аккаунт Programming Avenue, ответ: Redis, получи бесплатно****
Ссылаться на: воооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо