SlideShare une entreprise Scribd logo
1  sur  76
Télécharger pour lire hors ligne
Redis to the Rescue?

O’Reilly MySQL Conference
2011-04-13
Who?
• Tim Lossen / @tlossen
• Berlin, Germany
• backend developer at wooga
Redis Intro
Case 1: Monster World
Case 2: Happy Hospital
Discussion
Redis Intro
Case 1: Monster World
Case 2: Happy Hospital
Discussion
What?
• key-value-store
• in-memory database
• “data structure server”
Data Types
• strings (integers)
Data Types
• strings (integers)
• lists
• hashes
Data Types
• strings (integers)
• lists
• hashes
• sets
• sorted sets
flickr.com/photos/atzu/2645776918
Performance
• same for reads / writes
Performance
• same for reads / writes
• 50 K ops/second
 - regular notebook, EC2 instance
Performance
• same for reads / writes
• 50 K ops/second
 - regular notebook, EC2 instance
• 200 K ops/second
 - intel core i7 X980 (3.33 GHz)
Durability
• snapshots
• append-only log
Other Features
• master-slave replication
• virtual memory
• ...
Redis Intro
Case 1: Monster World
Case 2: Happy Hospital
Discussion
Daily Active Users

April   May   June   July   Aug   Sept     Oct      2010
Daily Active Users

April   May   June   July   Aug   Sept     Oct      2010
Challenge
• traffic growing rapidly
Challenge
• traffic growing rapidly
• bottleneck: write throughput
 - EBS volumes pretty slow
Challenge
• traffic growing rapidly
• bottleneck: write throughput
 - EBS volumes pretty slow
• MySQL already sharded
 - 4 x 2 = 8 shards
Idea
• move write-itensive data to Redis
Idea
• move write-itensive data to Redis
• first candidate: inventory
 - integer fields
 - frequently changing
Solution
• inventory = Redis hash
 - atomic increment / decrement !
Solution
• inventory = Redis hash
 - atomic increment / decrement !
• on-demand migration of users
 - with batch roll-up
Results
• quick win
 - implemented in 2 weeks
 - 10% less load on MySQL servers
Results
• quick win
 - implemented in 2 weeks
 - 10% less load on MySQL servers
• decision: move over more data
But ...
• “honeymoon soon over”
But ...
• “honeymoon soon over”
• growing memory usage
  (fragmentation)
 -   servers need periodic “refresh”
 -   replication dance
Current Status
• hybrid setup
 - 4 MySQL master-slave pairs
 - 4 Redis master-slave pairs
Current Status
• hybrid setup
 - 4 MySQL master-slave pairs
 - 4 Redis master-slave pairs
• evaluating other alternatives
 - Riak, Membase
Redis Intro
Case 1: Monster World
Case 2: Happy Hospital
Discussion
Challenge
• expected peak load:
 - 16000 concurrent users
 - 4000 requests/second
 - mostly writes
“Memory is the new Disk,
  Disk is the new Tape.”
             ⎯ Jim Gray
Idea
• use Redis as main database
 - excellent (write) performance
 - virtual memory for capacity
Idea
• use Redis as main database
 - excellent (write) performance
 - virtual memory for capacity
• no sharding = simple operations
Data Model
• user = single Redis hash
 - each entity stored in hash field
   (serialized to JSON)
Data Model
• user = single Redis hash
 - each entity stored in hash field
   (serialized to JSON)
• custom Ruby mapping layer
  (“Remodel”)
{“level”: 4,
1220032045     u1
                       “xp”: 241}

             u1_pets   [“p7”, “p8”]

                       {“pet_type”:
               p7
                          “Cat”}
                       {“pet_type”:
               p8
                          “Dog”}
                       {“level”: 1,
1234599660     u1
                        “xp”: 22}

             u1_pets     [“p3”]

               ...          ...
{“level”: 4,
1220032045     u1
                       “xp”: 241}

             u1_pets   [“p7”, “p8”]

                       {“pet_type”:
               p7
                          “Cat”}
                       {“pet_type”:
               p8
                          “Dog”}
                       {“level”: 1,
1234599660     u1
                        “xp”: 22}

             u1_pets     [“p3”]

               ...          ...
{“level”: 4,
1220032045     u1
                       “xp”: 241}

             u1_pets   [“p7”, “p8”]

                       {“pet_type”:
               p7
                          “Cat”}
                       {“pet_type”:
               p8
                          “Dog”}
                       {“level”: 1,
1234599660     u1
                        “xp”: 22}

             u1_pets     [“p3”]

               ...          ...
{“level”: 4,
1220032045     u1
                       “xp”: 241}

             u1_pets   [“p7”, “p8”]

                       {“pet_type”:
               p7
                          “Cat”}
                       {“pet_type”:
               p8
                          “Dog”}
                       {“level”: 1,
1234599660     u1
                        “xp”: 22}

             u1_pets     [“p3”]

               ...          ...
{“level”: 4,
1220032045     u1
                       “xp”: 241}

             u1_pets   [“p7”, “p8”]

                       {“pet_type”:
               p7
                          “Cat”}
                       {“pet_type”:
               p8
                          “Dog”}
                       {“level”: 1,
1234599660     u1
                        “xp”: 22}

             u1_pets     [“p3”]

               ...          ...
{“level”: 4,
1220032045     u1
                       “xp”: 241}

             u1_pets   [“p7”, “p8”]

                       {“pet_type”:
               p7
                          “Cat”}
                       {“pet_type”:
               p8
                          “Dog”}
                       {“level”: 1,
1234599660     u1
                        “xp”: 22}

             u1_pets     [“p3”]

               ...          ...
Virtual Memory
• server: 24 GB RAM, 500 GB disk
 - can only keep “hot data” in RAM
Virtual Memory
• server: 24 GB RAM, 500 GB disk
 - can only keep “hot data” in RAM
• 380 GB swap file
 - 50 mio. pages, 8 KB each
Dec 2010: Crisis
• memory usage growing fast
Dec 2010: Crisis
• memory usage growing fast
• cannot take snapshots any more
 - cannot start new slaves
Dec 2010: Crisis
• memory usage growing fast
• cannot take snapshots any more
 - cannot start new slaves
• random crashes
Analysis
• Redis virtual memory not
  compatible with:
 -   persistence
 -   replication
Analysis
• Redis virtual memory not
  compatible with:
 -   persistence
 -   replication
• need to implement our own!
Workaround
• “dumper” process
 - tracks active users
 - every 10 minutes, writes them
   into YAML file
ruby   redis   disk
ruby   redis   disk
ruby   redis   disk
ruby   redis   disk
ruby   redis   disk
Workaround
• in case of Redis crash
 - start with empty database
 - restore users on demand from
   YAML files
Real Solution
• Redis “diskstore”
 - keeps all data on disk
 - swaps data into memory as
   needed
Real Solution
• Redis “diskstore”
 - keeps all data on disk
 - swaps data into memory as
   needed
• under development (expected Q2)
Results
• average response time: 10 ms
Results
• average response time: 10 ms
• peak traffic:
 - 1500 requests/second
 - 15000 Redis ops/second
Current Status
• very happy with setup
 - simple, robust, fast
 - easy to operate
• still lots of spare capacity
Redis Intro
Case 1: Monster World
Case 2: Happy Hospital
Discussion
Advantages
• order-of-magnitude performance
 improvement
 -   removes main bottleneck
 -   enables simple architecture
Disadvantages
• main challenge: durability
 - diskstore very promising
Disadvantages
• main challenge: durability
 - diskstore very promising
• no ad-hoc queries
 - think hard about data model
 - hybrid approach?
Conclusion
• Ruby + Redis = killer combo
Q&A
redis.io
github.com/tlossen/remodel
wooga.com/jobs

Contenu connexe

Tendances

Building Apps with MongoDB
Building Apps with MongoDBBuilding Apps with MongoDB
Building Apps with MongoDBNate Abele
 
Building a Scalable Inbox System with MongoDB and Java
Building a Scalable Inbox System with MongoDB and JavaBuilding a Scalable Inbox System with MongoDB and Java
Building a Scalable Inbox System with MongoDB and Javaantoinegirbal
 
Pinterest的数据库分片架构
Pinterest的数据库分片架构Pinterest的数据库分片架构
Pinterest的数据库分片架构Tommy Chiu
 
Operational Intelligence with MongoDB Webinar
Operational Intelligence with MongoDB WebinarOperational Intelligence with MongoDB Webinar
Operational Intelligence with MongoDB WebinarMongoDB
 
MongoDB @ Frankfurt NoSql User Group
MongoDB @  Frankfurt NoSql User GroupMongoDB @  Frankfurt NoSql User Group
MongoDB @ Frankfurt NoSql User GroupChris Harris
 
Become a Java GC Hero - All Day Devops
Become a Java GC Hero - All Day DevopsBecome a Java GC Hero - All Day Devops
Become a Java GC Hero - All Day DevopsTier1app
 
MongoDB San Francisco 2013: Hash-based Sharding in MongoDB 2.4 presented by B...
MongoDB San Francisco 2013: Hash-based Sharding in MongoDB 2.4 presented by B...MongoDB San Francisco 2013: Hash-based Sharding in MongoDB 2.4 presented by B...
MongoDB San Francisco 2013: Hash-based Sharding in MongoDB 2.4 presented by B...MongoDB
 
Nested and Parent/Child Docs in ElasticSearch
Nested and Parent/Child Docs in ElasticSearchNested and Parent/Child Docs in ElasticSearch
Nested and Parent/Child Docs in ElasticSearchBeyondTrees
 
Introduction to Scala for Java Programmers
Introduction to Scala for Java ProgrammersIntroduction to Scala for Java Programmers
Introduction to Scala for Java Programmerssbjug
 
Scala for the doubters
Scala for the doubtersScala for the doubters
Scala for the doubtersMax Klyga
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDBantoinegirbal
 

Tendances (12)

MongoDB at GUL
MongoDB at GULMongoDB at GUL
MongoDB at GUL
 
Building Apps with MongoDB
Building Apps with MongoDBBuilding Apps with MongoDB
Building Apps with MongoDB
 
Building a Scalable Inbox System with MongoDB and Java
Building a Scalable Inbox System with MongoDB and JavaBuilding a Scalable Inbox System with MongoDB and Java
Building a Scalable Inbox System with MongoDB and Java
 
Pinterest的数据库分片架构
Pinterest的数据库分片架构Pinterest的数据库分片架构
Pinterest的数据库分片架构
 
Operational Intelligence with MongoDB Webinar
Operational Intelligence with MongoDB WebinarOperational Intelligence with MongoDB Webinar
Operational Intelligence with MongoDB Webinar
 
MongoDB @ Frankfurt NoSql User Group
MongoDB @  Frankfurt NoSql User GroupMongoDB @  Frankfurt NoSql User Group
MongoDB @ Frankfurt NoSql User Group
 
Become a Java GC Hero - All Day Devops
Become a Java GC Hero - All Day DevopsBecome a Java GC Hero - All Day Devops
Become a Java GC Hero - All Day Devops
 
MongoDB San Francisco 2013: Hash-based Sharding in MongoDB 2.4 presented by B...
MongoDB San Francisco 2013: Hash-based Sharding in MongoDB 2.4 presented by B...MongoDB San Francisco 2013: Hash-based Sharding in MongoDB 2.4 presented by B...
MongoDB San Francisco 2013: Hash-based Sharding in MongoDB 2.4 presented by B...
 
Nested and Parent/Child Docs in ElasticSearch
Nested and Parent/Child Docs in ElasticSearchNested and Parent/Child Docs in ElasticSearch
Nested and Parent/Child Docs in ElasticSearch
 
Introduction to Scala for Java Programmers
Introduction to Scala for Java ProgrammersIntroduction to Scala for Java Programmers
Introduction to Scala for Java Programmers
 
Scala for the doubters
Scala for the doubtersScala for the doubters
Scala for the doubters
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 

Plus de Tim Lossen

Apocalypse Later
Apocalypse LaterApocalypse Later
Apocalypse LaterTim Lossen
 
Embracing Failure
Embracing FailureEmbracing Failure
Embracing FailureTim Lossen
 
Embracing Failure
Embracing FailureEmbracing Failure
Embracing FailureTim Lossen
 
Enemy of the State?
Enemy of the State?Enemy of the State?
Enemy of the State?Tim Lossen
 
All Your Core Are Belong To Us
All Your Core Are Belong To UsAll Your Core Are Belong To Us
All Your Core Are Belong To UsTim Lossen
 
Podularity FTW!
Podularity FTW!Podularity FTW!
Podularity FTW!Tim Lossen
 
Cubic Foot Gardening
Cubic Foot GardeningCubic Foot Gardening
Cubic Foot GardeningTim Lossen
 
Dashboard Mania
Dashboard ManiaDashboard Mania
Dashboard ManiaTim Lossen
 
Event-Stream Processing with Kafka
Event-Stream Processing with KafkaEvent-Stream Processing with Kafka
Event-Stream Processing with KafkaTim Lossen
 
Treasure Island -- Concurrency in JRuby
Treasure Island -- Concurrency in JRubyTreasure Island -- Concurrency in JRuby
Treasure Island -- Concurrency in JRubyTim Lossen
 
Dashboard Mania
Dashboard ManiaDashboard Mania
Dashboard ManiaTim Lossen
 
JRuby vs. Rubinius
JRuby vs. RubiniusJRuby vs. Rubinius
JRuby vs. RubiniusTim Lossen
 
The Smallest Cluster in the World
The Smallest Cluster in the WorldThe Smallest Cluster in the World
The Smallest Cluster in the WorldTim Lossen
 
Announcing Euruko 2011
Announcing Euruko 2011Announcing Euruko 2011
Announcing Euruko 2011Tim Lossen
 
Memory: The New Disk
Memory: The New DiskMemory: The New Disk
Memory: The New DiskTim Lossen
 
Key-Value-Stores -- The Key to Scaling?
Key-Value-Stores -- The Key to Scaling?Key-Value-Stores -- The Key to Scaling?
Key-Value-Stores -- The Key to Scaling?Tim Lossen
 
Cassandra vs. Redis
Cassandra vs. RedisCassandra vs. Redis
Cassandra vs. RedisTim Lossen
 
An Introduction to Membase
An Introduction to MembaseAn Introduction to Membase
An Introduction to MembaseTim Lossen
 

Plus de Tim Lossen (20)

Apocalypse Later
Apocalypse LaterApocalypse Later
Apocalypse Later
 
Embracing Failure
Embracing FailureEmbracing Failure
Embracing Failure
 
Embracing Failure
Embracing FailureEmbracing Failure
Embracing Failure
 
Enemy of the State?
Enemy of the State?Enemy of the State?
Enemy of the State?
 
Beyond Devops
Beyond DevopsBeyond Devops
Beyond Devops
 
All Your Core Are Belong To Us
All Your Core Are Belong To UsAll Your Core Are Belong To Us
All Your Core Are Belong To Us
 
Podularity FTW!
Podularity FTW!Podularity FTW!
Podularity FTW!
 
Cubic Foot Gardening
Cubic Foot GardeningCubic Foot Gardening
Cubic Foot Gardening
 
Dashboard Mania
Dashboard ManiaDashboard Mania
Dashboard Mania
 
Event-Stream Processing with Kafka
Event-Stream Processing with KafkaEvent-Stream Processing with Kafka
Event-Stream Processing with Kafka
 
Into the Void
Into the VoidInto the Void
Into the Void
 
Treasure Island -- Concurrency in JRuby
Treasure Island -- Concurrency in JRubyTreasure Island -- Concurrency in JRuby
Treasure Island -- Concurrency in JRuby
 
Dashboard Mania
Dashboard ManiaDashboard Mania
Dashboard Mania
 
JRuby vs. Rubinius
JRuby vs. RubiniusJRuby vs. Rubinius
JRuby vs. Rubinius
 
The Smallest Cluster in the World
The Smallest Cluster in the WorldThe Smallest Cluster in the World
The Smallest Cluster in the World
 
Announcing Euruko 2011
Announcing Euruko 2011Announcing Euruko 2011
Announcing Euruko 2011
 
Memory: The New Disk
Memory: The New DiskMemory: The New Disk
Memory: The New Disk
 
Key-Value-Stores -- The Key to Scaling?
Key-Value-Stores -- The Key to Scaling?Key-Value-Stores -- The Key to Scaling?
Key-Value-Stores -- The Key to Scaling?
 
Cassandra vs. Redis
Cassandra vs. RedisCassandra vs. Redis
Cassandra vs. Redis
 
An Introduction to Membase
An Introduction to MembaseAn Introduction to Membase
An Introduction to Membase
 

Dernier

AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 

Dernier (20)

AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 

Redis to the Rescue?